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

时间:2018-05-19 14:20:44

标签: c# asp.net-core asp.net-core-identity asp.net-core-2.1

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

dotnet new razor --auth Individual --output Test

这会创建一个包含以下内容的Startup.c ..

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)。我正在使用静态类进行播种,它是从Program调用的。

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

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

services.AddIdentity<IdentityUser, IdentityRole>()

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

5 个答案:

答案 0 :(得分:19)

似乎最终微软明白并非每个应用程序都需要角色并将它们分开。

请注意AddDefaultIdentity声明为:

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

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

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

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

答案 1 :(得分:11)

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

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

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

答案 2 :(得分:4)

除了已经提供的答案之外,尽管添加了.AddRoles<Identity>(),但在控制器上使用Authorize(Roles = "Administrator")时仍然无法获得授权。由于某种原因,“角色声明似乎不影响角色名称的IsUserInRole或AuthorizeAttribute。”

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

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

通过这种方式,您不仅可以使用自己的角色,还可以为您架设身份页面。

在aspnet github上参考此问题: Issue 1813

答案 3 :(得分:1)

从.Net Core 2.1开始,AddDefaultIdentity与调用相同:

  • AddIdentity
  • AddDefaultUI
  • AddDefaultTokenProviders

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

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

仅此而已。注销并再次登录至关重要。

为了记录(为了测试),我尝试了services.AddIdentity

IServiceCollection不包含对'AddIdentity'的定义...

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

InvalidOperationException:未指定authenticationScheme,并且 找不到DefaultChallengeScheme。默认方案可以是 使用AddAuthentication(string defaultScheme)或 AddAuthentication(操作configureOptions)。

要使后两个功能正常工作,您可以做更多的工作,但是我要为AddDefaultIdentity发布的代码是使User.IsInRole和其他角色功能在.NET Core中正常工作所需要的。 2.1(和3.1)。

答案 4 :(得分:0)

我也曾在这个问题上作过斗争。我无法扮演角色。

在我的项目中,我使用了ASP.NET Core 2.1(可以在2.2中修复,请参见链接),还使用了一些页面。

在互联网上进行长时间搜索后,我发现了该解决方案(上面在Issue 1813中也提到过)

解决方案是针对我的(如本文中所建议的),使用IUserClaimsPrincipalFactory添加以下行:

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

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