我有问题:我正在使用 ASP.NET Core Identity。
用户、声明和角色之间的关系如下:用户有角色,角色有声明。
我的索赔保存在
AspNetRoleClaims
表中,角色保存在 AspNetRoles
表中,用户保存在 AspNetUsers
中。
用户通过
AspNetUserRoles
连接到角色。
现在我的用户拥有
CreateRole
权限,但是 CreateRole
端点返回 http 403 禁止错误。
我做错了什么?
请帮助我:)
这是我的
program.cs
:
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("RoleModulePolicy", policy => policy.RequireClaim("RoleModule"));
options.AddPolicy("CreateRolePolicy", policy => policy.RequireClaim("CreateRole"));
options.AddPolicy("EditRolePolicy", policy => policy.RequireClaim("EditRole"));
options.AddPolicy("DeleteRolePolicy", policy => policy.RequireClaim("DeleteRole"));
});
ClaimsStore.cs
文件
public static class ClaimsStore
{
public static List<Claim> GetAllClaims()
{
return new List<Claim>()
{
new Claim("RoleModule", "Role Module"),
new Claim("CreateRole", "Create Role"),
new Claim("EditRole", "Edit Role"),
new Claim("DeleteRole", "Delete Role"),
};
}
}
控制器:
[Authorize(Policy = "CreateRolePolicy")]
[HttpPost("[action]")]
public async Task<IActionResult> CreateRole(RoleCreateRequestModel model)
{
var result = await _roleManagementService.CreateRole(model);
if (result.Succeeded)
{
return Ok(result);
}
else
{
return BadRequest(result);
}
}
考虑到一些细节的缺失,请检查一下步骤是否有错误。
1.在Program.cs中注册角色服务
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
2.直接在program.cs中注册Claims
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("CreateRolePolicy", policy =>
policy.RequireClaim("CreateRole","Create Role"));
...
});
根据您的描述,您正在使用一个用户帐户,其角色声明创建角色以满足策略。以防万一,无论是AspNetUserClaims还是AspNetRoleClaims都会被检查,但为了匹配您的设计逻辑,最好遵循以下步骤。
3.创建角色。
4.将 RoleClaim 分配给角色。
5.为用户分配角色
在我本地全新的 AspNetCore Identity 项目中进行了测试,按预期工作,有任何困惑请随时分享。