Asp .Net Core 中的访问被声明授权拒绝
Access Denied in Asp .Net Core by Claims Authorization
我有我的登录处理程序方法。在该方法中,我将数据库中的声明添加到用户。
public async Task<IActionResult> OnPostAsync()
{
var result = await _signInManager.PasswordSignInAsync(LoginModel.UserName,
LoginModel.Password, LoginModel.RememberMe, false);
if (result.Succeeded)
{
var user = await _userManager.FindByNameAsync(LoginModel.UserName);
var claims = await _userManager.GetClaimsAsync(user);
ClaimsIdentity id = new (claims, "ApplicationCookie",
ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(id));
return Redirect("/");
}
return Page();
}
在 Startup class 我这样注册了我的保单
services.AddAuthorization(options =>
{
options.AddPolicy("IsAdmin", policy => { policy.RequireClaim("Admin"); });
});
但是我在管理员帐户下无法访问此 PageModel
[Authorize(Policy = "IsAdmin")]
public class UserPanel : PageModel
{}
请告诉我我做错了什么。
options.AddPolicy("IsAdmin", policy => { policy.RequireClaim("Admin"); });
AuthorizationPolicyBuilder.RequireClaim(string)
检查是否存在具有指定声明 type 的声明。它不会查看声明值,而只会检查是否存在具有匹配声明类型的 any 声明。
由于您的索赔属于索赔类型 IsAdmin
,索赔价值 Admin
,因此您必须检查 IsAdmin
索赔:
// check for the claim type `IsAdmin`
options.AddPolicy("IsAdmin", policy => policy.RequireClaim("IsAdmin"));
您还可以使用 the other overload 除了声明类型之外还检查声明值:
// check for the claim type `IsAdmin` with value `Admin`
options.AddPolicy("IsAdmin", policy => policy.RequireClaim("IsAdmin", "Admin"));
我有我的登录处理程序方法。在该方法中,我将数据库中的声明添加到用户。
public async Task<IActionResult> OnPostAsync()
{
var result = await _signInManager.PasswordSignInAsync(LoginModel.UserName,
LoginModel.Password, LoginModel.RememberMe, false);
if (result.Succeeded)
{
var user = await _userManager.FindByNameAsync(LoginModel.UserName);
var claims = await _userManager.GetClaimsAsync(user);
ClaimsIdentity id = new (claims, "ApplicationCookie",
ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(id));
return Redirect("/");
}
return Page();
}
在 Startup class 我这样注册了我的保单
services.AddAuthorization(options =>
{
options.AddPolicy("IsAdmin", policy => { policy.RequireClaim("Admin"); });
});
但是我在管理员帐户下无法访问此 PageModel
[Authorize(Policy = "IsAdmin")]
public class UserPanel : PageModel
{}
请告诉我我做错了什么。
options.AddPolicy("IsAdmin", policy => { policy.RequireClaim("Admin"); });
AuthorizationPolicyBuilder.RequireClaim(string)
检查是否存在具有指定声明 type 的声明。它不会查看声明值,而只会检查是否存在具有匹配声明类型的 any 声明。
由于您的索赔属于索赔类型 IsAdmin
,索赔价值 Admin
,因此您必须检查 IsAdmin
索赔:
// check for the claim type `IsAdmin`
options.AddPolicy("IsAdmin", policy => policy.RequireClaim("IsAdmin"));
您还可以使用 the other overload 除了声明类型之外还检查声明值:
// check for the claim type `IsAdmin` with value `Admin`
options.AddPolicy("IsAdmin", policy => policy.RequireClaim("IsAdmin", "Admin"));