使用ASP:Net Identity 2.1检查角色不起作用

时间:2018-10-07 07:38:35

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

我将ASP.Net MVC Core应用程序从1.1升级到2.1,包括将ASP.Net Identity从1.1迁移到2.1。

我可以使用Sqlite进行包括ASP.Net Identity EntityFramework集成在内的所有工作。

我的startup.cs配置类似于this

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

        services.Configure<IdentityOptions>(options =>
        {
            // Password settings.
            options.Password.RequireDigit = true;
            options.Password.RequireLowercase = true;
            options.Password.RequireNonAlphanumeric = true;
            options.Password.RequireUppercase = true;
            options.Password.RequiredLength = 6;
            options.Password.RequiredUniqueChars = 1;

            // Lockout settings.
            options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
            options.Lockout.MaxFailedAccessAttempts = 5;
            options.Lockout.AllowedForNewUsers = true;

            // User settings.
            options.User.AllowedUserNameCharacters =
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
            options.User.RequireUniqueEmail = false;
        });

        services.AddAuthentication()
            .AddMicrosoftAccount(options =>
            {
                options.ClientId = Configuration["Authentication:Microsoft:ClientId"];
                options.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
            });

        services.AddAuthorization(options =>
        {
            options.AddPolicy(PolicyNames.RequireTauchbold, policy => policy.RequireRole(Rolenames.Tauchbold));
        });

在Configure()中,我有:

app.UseAuthentication();

然后在我的控制器中有:

[Authorize(Policy = PolicyNames.RequireTauchbold)]
public class EventController : Controller
{
    ...

完整的源代码可以在GitHub上找到。

问题

问题是,即使我已正确登录并分配了角色,控制器上的上述检查也始终返回“拒绝访问”。我不知道这可能会出错。有人知道我会想念here吗?

更新

我认为普通的空[Authorize]属性有效(强制登录),但是[Authorize(Policy = '...')]无法识别该角色。我检查了数据库表,但它们对我来说不错。我是否需要在数据库中配置ÀspNetUsersAspNetRolesAspNetUserRoles之外的其他任何内容?

更新2:

我将它与@itminus的解决方案一起使用,但是必须在启动时向AddDefaultUI()添加一个调用才能使Login and Register再次起作用。因此,我的启动现在包含以下几行以配置身份:

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

1 个答案:

答案 0 :(得分:2)

我刚刚测试了您的代码。由于AddDefaultIdentity<IdentityUser>()版本的2.1.x默认情况下不会启用Role,因此我将您的代码更改如下:

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

services.AddIdentity<IdentityUser, IdentityRole>()
    .AddRoleManager<RoleManager<IdentityRole>>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

要使用上述代码进行测试,我注册了一个新用户并为该用户添加角色:

await _roleManager.CreateAsync(new IdentityRole(Rolenames.Tauchbold));
var user= await _userManager.GetUserAsync(HttpContext.User);
await _userManager.AddToRoleAsync(user, Rolenames.Tauchbold);

先退出,然后再次登录,即可使用:

enter image description here