我正在尝试使用[Authorize(Roles =“ Administrator”)] 但是我总是收到“ 访问被拒绝”。
要测试我是否正确添加了角色,我在控制器中添加了以下代码:
var test=User.IsInRole("Administrator");
var user = await userManager.GetUserAsync(User);
var roles =await userManager.GetRolesAsync(user);
rolesOfUser = roles.ToList();
我添加的角色错误吗?
Why does IsInRole always return false?建议用户未登录或未完成所有身份验证过程。如果是这种情况,我该怎么办?
播种数据:
public async Task SeedAsync()
{
context.Database.EnsureCreated();
if (await roleManager.RoleExistsAsync("Administrator") == false)
{
await roleManager.CreateAsync(new IdentityRole("Administrator"));
}
var user = await userManager.FindByEmailAsync("Jakob.Madsen@********.com");
if (user == null)
{
user = new IdentityUser()
{
UserName = "Jakob.Madsen@*********.com",
PhoneNumber = "*********",
Email = "Jakob.Madsen@*********.com",
};
var result = await userManager.CreateAsync(user, "*********");
if (result == IdentityResult.Success)
{
userManager.AddToRoleAsync(user, "Administrator").Wait();
}
else
{
throw new InvalidOperationException("Could not create Administrator");
}
}
var resultRoles = await userManager.GetRolesAsync(user);
if (resultRoles.Contains("Administrator") == false)
{
userManager.AddToRoleAsync(user, "Administrator").Wait();
}
}
更新: 我按照建议遵循此ASP .Net Core Identity Role Claims not adding to User。 现在可以使用了。
答案 0 :(得分:2)
IsInRole
方法和[Authorize(Roles="Administrator")]
属性检查此声明主体拥有的身份是否包含类型为ClaimsIdentity.RoleClaimType
(http://schemas.microsoft.com/ws/2008/06/identity/claims/role
)的声明,其中声明的值为等于role参数指定的值。
总而言之,如果您调用IsInRole,默认情况下将假设您代表角色的声明具有上述类型-否则角色检查将不会成功。您可以通过列出索赔来确认这一点:
var claims = User.Claims.ToList();
您没有提供角色的种子方式,但是您可以找到很多代码示例:
ASP.NET Core 2.0: Getting Started With Identity And Role Management
.NET Core 2.1 Use Role Management
也不要忘记注销并再次登录以查看所需的行为。