.ASP.NET Core仅在控制器上存在策略时运行策略处理程序

时间:2019-11-19 20:13:50

标签: c# asp.net .net asp.net-core

我正在创建一个自定义授权策略处理程序来保护我的某些路由。我在大多数控制器上使用[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)));
});

1 个答案:

答案 0 :(得分:1)

这是我的错,是错误的警报。它按预期工作,我刚刚在后台调用了一个控制器方法,该方法已经附加了策略(之前出于测试目的而添加,忘记删除了)。因此它被调用,并使其看起来好像在不应该执行的处理程序中被执行。