如何解决基于角色的授权在 .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 举报,一经查实,本站将立刻删除。