微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

解决方法

简单的自定义用户从 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,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>();

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。