我正在创建一个自定义授权策略处理程序来保护我的某些路由。我在大多数控制器上使用[Authorize]
过滤器,但是,我希望其中的一些使用[Authorize(Policy="IsVerified")]
,以便仅在{{ 1}}声明存在。
我的问题是我已经创建了处理程序,但是它正在具有IsVerified
过滤器的每条路由上运行,而不仅仅是具有[Authorize]
的路由。只能在该策略存在的地方运行处理程序吗?
这是我的自定义处理程序:
[Authorize(Policy="IsVerified"]
这是我在Startup.cs中注册它的方式。
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;
}
}
用法示例
services.AddSingleton<IAuthorizationHandler, UserVerifiedHandler>();
services.AddAuthorization(options =>
{
options.AddPolicy("UserIsVerified",
policy => policy.Requirements.Add(new UserVerifiedRequirement(true)));
});
答案 0 :(得分:1)
这是我的错,是错误的警报。它按预期工作,我刚刚在后台调用了一个控制器方法,该方法已经附加了策略(之前出于测试目的而添加,忘记删除了)。因此它被调用,并使其看起来好像在不应该执行的处理程序中被执行。