基于策略的授权不适用于asp.net核心

时间:2018-06-11 07:57:53

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

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

然而我似乎无法解雇它。

在下面的例子中,我已经注释掉了context.suceeed行,所以我认为我对用户控制器的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似乎根本没有被调用。

2 个答案:

答案 0 :(得分:5)

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

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

如果您对将在DI容器中注册的确切服务感兴趣,请访问this链接。

答案 1 :(得分:1)

我有类似的问题,我通过以下方式解决了该问题:

  

services.AddMvcCore()。 AddAuthorization() .AddJsonFormatters();