如何在 ASP.NET Core 2.1 中使用角色?

How to use Roles in ASP.NET Core 2.1?

我使用以下方法创建了一个测试项目:

dotnet new razor --auth Individual --output Test

这将创建一个 Startup.cs,其中包含:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlite(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

我想播种一些用户和角色。用户和角色都将使用相同的存储 (SQLite)。我正在使用静态 class 进行播种,它是从 Program.

调用的

我可以播种用户,但不能播种角色,因为上面似乎没有注入 RoleManager

在 ASP.NET Core 2.0 中使用了以下内容:

services.AddIdentity<IdentityUser, IdentityRole>()

我猜 AddDefaultIdentity 是 2.1 中的新功能,但问题是它没有注入 RoleMnager,所以我该怎么办?

看来微软终于明白并不是每个应用程序都需要角色并将它们分开。

注意 AddDefaultIdentity 声明为:

public static IdentityBuilder AddDefaultIdentity<TUser>(this IServiceCollection services) where TUser : class;

因此,您可以继续通过 IdentityBuilder 配置身份选项。你要做的是:

services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>();

幸运的是,他们还删除了 IUserIRole 约束,因此现在您可以在完全独立的程序集中使用模型,而无需安装数百个 NuGet 包。

可能会帮助其他人:如果您通过脚手架将 asp.net 身份添加到现有项目,您将需要编辑 IdentityHostingStartup.cs 并更改那里的服务,而不是在您的启动 class:

services.AddIdentity<AppUser, IdentityRole>()
                .AddDefaultUI()
                .AddRoles<IdentityRole>()
                .AddRoleManager<RoleManager<IdentityRole>>()
                .AddDefaultTokenProviders()
                .AddEntityFrameworkStores<authContext>();

然后你可以在你的播种中使用角色管理器。

除了已经提供的答案外,尽管添加了.AddRoles<Identity>(),但在我的控制器上使用Authorize(Roles = "Administrator")时仍然无法获得授权。由于某种原因,"role claim doesn't seem to affect IsUserInRole or AuthorizeAttribute with a role name."

要使用角色,我建议使用 ASP.NET 2.0 方式,如下所示:

services.AddIdentity<IdentityUser, IdentityRole>()
            .AddDefaultUI()
            .AddDefaultTokenProviders()
            .AddEntityFrameworkStores<ApplicationDbContext>();

通过这种方式,您可以使用自己的角色,还可以获得为您构建的身份页面。

参考aspnet上的这个问题github: Issue 1813

我前段时间也遇到过这个问题。我无法让角色发挥作用。

在我的项目中,我使用了 ASP.NET Core 2.1(它可以在 2.2 中修复,请参阅 link)并且还构建了一些页面。

在网上搜索了很长时间后,我找到了这个解决方案(上面Issue 1813中也提到了)

我的解决方案(如文章中所建议的那样)在 IUserClaimsPrincipalFactory 中添加以下行:

        services.AddScoped<IUserClaimsPrincipalFactory<IdentityUser>, 
            UserClaimsPrincipalFactory<IdentityUser, IdentityRole>>();

        services.AddDefaultIdentity<IdentityUser>()
            .AddRoles<IdentityRole>()
            .AddRoleManager<RoleManager<IdentityRole>>()
            .AddDefaultTokenProviders()
            .AddEntityFrameworkStores<TranslatorDbContext>();

从 .Net Core 2.1 开始,AddDefaultIdentity 等同于调用:

  • AddIdentity
  • AddDefaultUI
  • AddDefaultTokenProviders

要添加角色功能,请转到 ConfigureServices 下的 Startup.cs 您可以像这样使用 .AddRoles

services.AddDefaultIdentity<IdentityUser>()
    .AddRoles<IdentityRole>()            //<-- This line
    .AddEntityFrameworkStores<ApplicationDbContext>();

这就是所有需要的。注销再登录很关键

作为记录(并且只是为了测试),我尝试了 services.AddIdentity:

IServiceCollection does not contain a defintion for 'AddIdentity'...

services.AddIdentityCore(调试并显示页面之前没有错误):

InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found. The default schemes can be set using either AddAuthentication(string defaultScheme) or AddAuthentication(Action configureOptions).

您可以做更多的事情来让后两个工作,但我为 AddDefaultIdentity 发布的代码是我需要的所有代码,以便让 User.IsInRole 和其他角色功能在 . NET 核心 2.1(和 3.1)。