我正在使用简单的cookie 身份验证( .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie
) 并且默认情况下需要经过身份验证的用户,因此请使用:
options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
这工作正常:如预期导航到未经身份验证的 URL 重定向到我的登录页面。
我现在在AuthorizationHandler
下面添加了适用于用户角色的自定义。
这也有效,但是它似乎覆盖了默认的 cookie 身份验证行为,即如果我没有登录并导航到用我的处理程序装饰的控制器,[Authorize(Policy = "DemoPolicy")]
而不是被重定向到登录页面,我被调用(HandleRequirementAsync()
并且当前失败context.User
)null
.
有没有办法让这些东西一起玩?我可以更改我的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 {
...