1

我正在使用简单的cookie 身份验证( .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie) 并且默认情况下需要经过身份验证的用户,因此请使用:

options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();

这工作正常:如预期导航到未经身份验证的 URL 重定向到我的登录页面。

我现在在AuthorizationHandler下面添加了适用于用户角色的自定义。

这也有效,但是它似乎覆盖了默认的 cookie 身份验证行为,即如果我没有登录并导航到用我的处理程序装饰的控制器,[Authorize(Policy = "DemoPolicy")]而不是被重定向到登录页面,我被调用(HandleRequirementAsync()并且当前失败context.Usernull.

有没有办法让这些东西一起玩?我可以更改我的AuthorizationHandler,以便它识别出没有经过身份验证的用户并重定向到我的登录页面吗?


授权处理程序:

public class RoleHandler : AuthorizationHandler<RolesRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolesRequirement requirement) {
        string userRoleName = context.User.Claims.FirstOrDefault(claim => claim.Type == ClaimsIdentity.DefaultRoleClaimType).Value;
    
        if (userRoleName == "let-me-in")
            context.Succeed(requirement);
    }

这使用了一个简单的要求

public class RolesRequirement : IAuthorizationRequirement
{
    public RolesRequirement(string role) {
        Role = role;
    }

    public string Role { get; }
}

我创建了一个策略:

services.AddAuthorization(options => {
    options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();

    options.AddPolicy(SecuriyPolicies.RequireManagerRole, policy => policy.Requirements.Add(new RolesRequirement("let-me-in")));
});
        

并将其应用于控制器:

[Authorize(Policy = "DemoPolicy")]
public class MyController : Controller {
    ...
    
4

0 回答 0