我正在创建一个自定义授权策略处理程序来保护我的一些路由。我在我的大部分 Controller 上使用 [Authorize]
过滤器,但是,我希望其中的一些 使用 [Authorize(Policy="IsVerified") ]
以便它仅在 IsVerified
声明存在时才允许访问。
我的问题是我已经创建了我的处理程序,但它正在每个具有 [Authorize]
过滤器的路由上运行,而不仅仅是那些具有 [Authorize(Policy ="IsVerified"]
。是否可以只在该策略存在的地方运行处理程序?
这是我的自定义处理程序:
public class UserVerifiedHandler : AuthorizationHandler<UserVerifiedRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, UserVerifiedRequirement requirement)
{
bool isVerified = Convert.ToBoolean(context.User.FindFirst("UserIsVerified").Value);
if (isVerified)
{
context.Succeed(requirement);
}
else
{
context.Fail();
}
return Task.CompletedTask;
}
}
这是我在我的 Startup.cs 中注册它的方式
services.AddSingleton<IAuthorizationHandler, UserVerifiedHandler>();
services.AddAuthorization(options =>
{
options.AddPolicy("UserIsVerified",
policy => policy.Requirements.Add(new UserVerifiedRequirement(true)));
});
示例用法
[Authorize(Policy="UserIsVerified")
public IActionResult RouteToOnlyAllowAuthorizedAndVerified() {
//Access here only if claim is true
}
[Authorize]
public IActionResult RouteToAllowAuthorized() {
//Access here regardless if claim true or false
}
最佳答案
这是我的错误,误报。它按预期工作,我只是在后台调用了一个 Controller 方法,该方法已经附加了策略(之前出于测试目的添加但忘记删除)。所以它被调用并使处理程序看起来像是在不应该执行的时候执行了。
关于c# - .ASP.NET Core 仅在 Controller 上存在策略时运行策略处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58942136/