基于角色的授权在 .net 5 中不起作用

时间:2021-06-24 09:42:56

标签: asp.net-core .net-5 asp.net-authorization authorize asp.net5

问题陈述:我遇到了这个问题,角色基础授权 ([Authorize(Roles = "Admin")]) 在 asp .net 5 中没有按预期工作,角色声明没有添加到身份。

我用谷歌搜索并尝试了许多解决方案,最后我能够弄清楚。所以我分享了一些场景,以便它可以帮助某人。

1 个答案:

答案 0 :(得分:0)

简单的自定义用户从 IdentityUser 继承的地方 例如:

 public class ApplicationUser : IdentityUser
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

像下面这样更新 ConfigureServices 应该可以工作:

services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
                    .AddRoles<IdentityRole>()
                    .AddRoleManager<RoleManager<IdentityRole>>()
                    .AddDefaultUI()
                    .AddEntityFrameworkStores<ApplicationDbContext>();

但是如果您使用 UserClaimsPrincipalFactory

将自定义声明添加到 UserPrincipal 中

例如:

public class AppUserClaimsIdentityFactory : UserClaimsPrincipalFactory<ApplicationUser>
{

    public AppUserClaimsIdentityFactory(
    UserManager<ApplicationUser> userManager,
    IOptions<IdentityOptions> optionsAccessor)
        : base(userManager, optionsAccessor)
    {
    }

    protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
    {
        ClaimsIdentity identity = await base.GenerateClaimsAsync(user);
        identity.AddClaim(new Claim("FirstName", user.FirstName ?? "[Add First Name]"));
        return identity;
    }
}

并使用 DI 注入它,如下所示:

services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, AppUserClaimsIdentityFactory>();

这行不通。

在这种情况下,您需要使用其他重载,即 UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>

更新您的 AppUserClaimsIdentityFactory 如下:

public class AppUserClaimsIdentityFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
{
    public AppUserClaimsIdentityFactory(
    UserManager<ApplicationUser> userManager,
    RoleManager<IdentityRole> roleManager,
    IOptions<IdentityOptions> optionsAccessor)
        : base(userManager, roleManager, optionsAccessor)
    {
    }

protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
{
    ClaimsIdentity identity = await base.GenerateClaimsAsync(user);
    identity.AddClaim(new Claim("FirstName", user.FirstName ?? "[Click to edit profile - First Name]"));
    return identity;
}

}

像以前一样在 DI 容器中添加 AppUserClaimsIdentityFactory。

services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, AppUserClaimsIdentityFactory>();

一切都应该按预期正常工作。如果您认为有更好的方法来做同样的事情,希望这有助于更新。

相关问题