首页 > 解决方案 > 基于策略的授权在 asp.net 核心中不起作用

问题描述

我正在尝试根据本文在 .net core 2.1 中使用基于策略的授权: https ://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies?view=aspnetcore-2.1

但是我似乎无法让它着火。

在下面的示例中,我已经注释掉了 context.succeeed 行,所以我会认为我对用户控制器的 api 调用会失败。

但是我的 API 调用正在被接受。

我究竟做错了什么?

这是我的startup.cs

public class Startup
{

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddSingleton<IAuthorizationHandler, VerifyAuthCookieHandler>();

        services.AddAuthorization(options =>
        {
            options.AddPolicy("VerifyAuthCookie", policy =>
                policy.Requirements.Add(new VerifyAuthCookieRequirement()));
        });

        services.AddMvcCore().AddJsonFormatters();

    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseMvc();
    }

}

这是我的处理程序

public class VerifyAuthCookieHandler : AuthorizationHandler<VerifyAuthCookieRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   VerifyAuthCookieRequirement requirement)
    {

        //context.Succeed(requirement);

        return Task.CompletedTask;
    }
}

这是我的要求:

public class VerifyAuthCookieRequirement : IAuthorizationRequirement
{

    public VerifyAuthCookieRequirement()
    {

    }
}

最后,我的控制器:

[Route("api/[controller]")]
[Authorize(Policy = "VerifyAuthCookie")]
public class UserController : Controller
{

}

如果我在 HandleRequirementAsync 中添加代码并设置断点,那么在调试时它不会被命中,所以我的 Handler 似乎根本没有被调用。

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

解决方案


您应该在 Startup 类的 Configure 方法app.UseAuthentication();之前调用。app.UseMvc();这会将 ASP.NET Core 身份验证中间件添加到请求管道中。

由于您正在使用services.AddMvcCore()我们需要手动配置授权服务,因此services.AddMvc()会自动为您服务。我们应该添加.AddAuthorization()IMvcCoreBuilder. 这将添加默认的身份验证和授权服务以及 PolicyEvaluator。

如果您对将在您的 DI 容器中注册的确切服务感兴趣,您应该点击链接。


推荐阅读