问题陈述:我遇到了这个问题,角色基础授权 (
[Authorize(Roles = "Admin")]
) 在 asp .net 5 中没有按预期工作,角色声明未添加到身份中。
我用谷歌搜索并尝试了很多解决方案,最后我找到了答案。所以我分享一些场景,以便它可能对某人有所帮助。
如果您有一个继承自 IdentityUser 的自定义用户
例如:
public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
并且您已正确配置服务,如下所示:
services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>() /* Added role manager*/
.AddDefaultUI()
.AddEntityFrameworkStores<ApplicationDbContext>();
如果您没有为 UserPrincipal 使用自定义声明主体,那么应该可以正常工作。
例如:
public class AppUserClaimsIdentityFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
public AppUserClaimsIdentityFactory(
UserManager<ApplicationUser> userManager,
IOptions<IdentityOptions> optionsAccessor)
: base(userManager, optionsAccessor)
{
}
/* code implementation */
}
并使用 DI 注入它,如下所示:
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, AppUserClaimsIdentityFactory>();
在这种情况下它不起作用,您需要为 UserClaimsPrincipalFactory 使用不同的构造函数重载并向其添加角色管理器。
更新您的自定义 UserClaimsIdentityFactory:
public class AppUserClaimsIdentityFactory :
UserClaimsPrincipalFactory<ApplicationUser,
IdentityRole>
/* Note: you can use your custom Role class or identity default */
{
public AppUserClaimsIdentityFactory(
UserManager<ApplicationUser> userManager,
RoleManager<IdentityRole> roleManager, /* Add role manager */
IOptions<IdentityOptions> optionsAccessor)
: base(userManager, roleManager /* send it to base constructor */, optionsAccessor)
{
}
/* code implementation */
}
您不必为自定义 UserClaimsPrincipalFactory 更改 依赖注入 容器中的任何内容。
一切都应该按预期正常工作。