c# - Asp .Net Core 中的访问被声明授权拒绝

标签 c# asp.net-core 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();
}

在启动类中,我像这样注册了我的策略

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)检查是否存在具有指定声明类型的声明。它不会查看声明值,而只是检查是否存在具有匹配声明类型的任何声明。

由于您的声明属于声明类型 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")); 

关于c# - Asp .Net Core 中的访问被声明授权拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65873722/

相关文章:

docker - OSX 中的 docker 容器中缺少 Dotnet Antiforgery dll

c# - ASP.NET Core 3.1 Azure AD 身份验证抛出 OptionsValidationException

c# - ASP.Net Core 应用程序可在 visual studio 中运行,但不适用于 dotnet run

authentication - Kubernetes 中的服务帐户 token 管理

ASP.NET MVC - 角色提供程序的替代方案?

c# - 如果在 C# 中的 Catch block 中发生异常,会发生什么情况。在这种情况下调用者的结果也是什么

c# - 脚本bat,windows找不到.exe

authentication - 实现用户登录系统的正确方法

c# - 如何/在何处查找 WPF 控件的 Microsoft 默认样式

c# - 通过 web api 调用启动 web 驱动程序 chrome 浏览器