ASP.NET 核心 3.1 MVC 访问被拒绝基于角色的授权 - 与自定义 UserClaimsPrincipalFactory 冲突
ASP.NET Core 3.1 MVC Access Denied role based authorization - Conflict with custom UserClaimsPrincipalFactory
我已经在Whosebug上阅读了很多类似问题的答案,但仍然无法弄清楚我做错了什么。
我的 AspNetUsers、AspNetRoles 和 AspNetUserRoles 表已正确设置种子。
这是我的配置服务:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseLazyLoadingProxies().UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>(options => options.SignIn.RequireConfirmedAccount = false)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddClaimsPrincipalFactory<CustomUserClaimsPrincipalFactory>();
services.AddControllersWithViews();
services.AddMvc();
services.AddRazorPages();
services.AddAuthorization(options => {
options.AddPolicy("ManagerOnly", policy => policy.RequireRole("Manager"));
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
services.Configure<IdentityOptions>(options =>
{
...
});
services.ConfigureApplicationCookie(options =>
{
...
});
services.Configure<PasswordHasherOptions>(option =>
{
...
});
}
当我们select“个人用户帐户”作为身份验证方法时,我正在使用Visual Studio脚手架的默认身份管理。
当我放
[Authorize(Policy = "ManagerOnly"]
在任何操作上,即使从具有管理员角色的正确用户帐户登录,我也会收到拒绝访问结果。
编辑:
我已经确认删除 .AddClaimsPrincipalFactory<CustomUserClaimsPrincipalFactory>();
后问题消失了
以下是我的 CustomUserClaimsPrincipalFactory:
public class CustomUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
public CustomUserClaimsPrincipalFactory(
UserManager<ApplicationUser> userManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, optionsAccessor)
{
}
protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
{
var identity = await base.GenerateClaimsAsync(user);
identity.AddClaim(new Claim("FullName", user.FullName ?? "Unnamed"));
return identity;
}
}
知道为什么这会与角色冲突吗?
编辑 2:
像我这样的菜鸟解决方案:
public class CustomUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
{
public CustomUserClaimsPrincipalFactory(
UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, roleManager, optionsAccessor)
{
}
根据我的理解,需要在自定义声明工厂中注入角色管理器,以便在我们覆盖基本声明生成时加载数据库中定义的角色。
我认为您注入到 CustomUserClaimsPrincipalFactory 的依赖项在某种程度上有所不同或未正确解析,因此无法连接到数据库。
请确保在启动时正确设置了角色管理器。
我已经在Whosebug上阅读了很多类似问题的答案,但仍然无法弄清楚我做错了什么。
我的 AspNetUsers、AspNetRoles 和 AspNetUserRoles 表已正确设置种子。
这是我的配置服务:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseLazyLoadingProxies().UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>(options => options.SignIn.RequireConfirmedAccount = false)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddClaimsPrincipalFactory<CustomUserClaimsPrincipalFactory>();
services.AddControllersWithViews();
services.AddMvc();
services.AddRazorPages();
services.AddAuthorization(options => {
options.AddPolicy("ManagerOnly", policy => policy.RequireRole("Manager"));
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
services.Configure<IdentityOptions>(options =>
{
...
});
services.ConfigureApplicationCookie(options =>
{
...
});
services.Configure<PasswordHasherOptions>(option =>
{
...
});
}
当我们select“个人用户帐户”作为身份验证方法时,我正在使用Visual Studio脚手架的默认身份管理。
当我放
[Authorize(Policy = "ManagerOnly"]
在任何操作上,即使从具有管理员角色的正确用户帐户登录,我也会收到拒绝访问结果。
编辑:
我已经确认删除 .AddClaimsPrincipalFactory<CustomUserClaimsPrincipalFactory>();
以下是我的 CustomUserClaimsPrincipalFactory:
public class CustomUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
public CustomUserClaimsPrincipalFactory(
UserManager<ApplicationUser> userManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, optionsAccessor)
{
}
protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
{
var identity = await base.GenerateClaimsAsync(user);
identity.AddClaim(new Claim("FullName", user.FullName ?? "Unnamed"));
return identity;
}
}
知道为什么这会与角色冲突吗?
编辑 2:
像我这样的菜鸟解决方案:
public class CustomUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
{
public CustomUserClaimsPrincipalFactory(
UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, roleManager, optionsAccessor)
{
}
根据我的理解,需要在自定义声明工厂中注入角色管理器,以便在我们覆盖基本声明生成时加载数据库中定义的角色。
我认为您注入到 CustomUserClaimsPrincipalFactory 的依赖项在某种程度上有所不同或未正确解析,因此无法连接到数据库。
请确保在启动时正确设置了角色管理器。