如何使[Authorize(Roles =“ Administrator”)]在mvc ASP.NET Core中工作

时间:2019-06-19 11:33:45

标签: asp.net entity-framework asp.net-core authorization

我正在ASP.NET Core(实体框架)中准备应用程序,在这里我希望某些功能仅限于特定用户。

要在Startup.cs中实现此目的,请添加以下代码 服务:

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

用于创建新的默认用户的类:

public static class MyIdentityDataInitializer
{
    public static void SeedData(UserManager<IdentityUser> userManager, RoleManager<IdentityRole> roleManager) 
    {
        SeedRoles(roleManager);
        SeedUsers(userManager);
    }

    public static void SeedUsers(UserManager<IdentityUser> userManager)
    {
        if (userManager.FindByNameAsync("user@email.com").Result==null)
        {
            IdentityUser user = new IdentityUser();
            user.UserName = "user@email.com";
            user.Email = "user@email.com";
            IdentityResult result = userManager.CreateAsync(user, "Admin1").Result;  //Admin1 = password

            if (result.Succeeded)
            {
                userManager.AddToRoleAsync(user, "Administrator").Wait(); //add user to role
            }
        }

    }

    public static void SeedRoles(RoleManager<IdentityRole> roleManager)
    {
        if (!roleManager.RoleExistsAsync("StandardUser").Result)
        {
            IdentityRole role = new IdentityRole();
            role.Name = "StandardUser";
            IdentityResult roleResult = roleManager.CreateAsync(role).Result;
        }

        if (!roleManager.RoleExistsAsync("Administrator").Result)
        {
            IdentityRole role = new IdentityRole();
            role.Name = "Administrator";
            role.NormalizedName = "Administrator";
            IdentityResult roleResult = roleManager.CreateAsync(role).Result;
        }
    }
}

}

在“配置方法”中,我将其称为:

MyIdentityDataInitializer.SeedData(userManager, roleManager); 

在我想限制动作的控制器中

 [Authorize(Roles = "Administrator")]
    public IActionResult ConfigurationPortal()
    {
     .....
    }

当前情况是:

我可以在数据库中检查是否创建了用户和角色(数据库ASPNetUser,ASPNetRoles),也可以在数据库ASPNetUserRoles存在的行中将用户映射为管理员。 启动应用程序后,我可以登录,但是当我尝试打开ConfigurationPortal()(或其他受限制的方法)时,将显示“访问受限制”信息。看起来管理员用户未被识别为管理员。

预期情况是;将用户附加到角色管理员后,他们可以访问受限方法。

1 个答案:

答案 0 :(得分:1)

  

启动应用程序后,我可以登录,但是当我尝试打开ConfigurationPortal()(或其他受限制的方法)时,将显示“访问受限制”信息。看来管理员用户未被识别为管理员。

这是2.1版本中的一个已知错误。参见issue

我遵循using the old api suggested by HaoK and C-BERBER的建议,现在它可以正常工作了。

这是我的DbContext:

  public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

使用旧式api配置身份:

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

最后,注销并重新登录,它现在将按预期运行。