首页 > 解决方案 > AuthorizeAttribute 不适用于 ASP.NET Core 3.1 中的端点路由

问题描述

我将 ASP.NET Core 应用程序从 2.2 版迁移到 3.1 版。我有一个具有[Authorize]如下属性的控制器:

[ApiController]
[Authorize(policy: "MyPolicy")]
[Route("api/v{version:apiVersion}/[controller]")]
public class MyController : Controller

该策略在 Startup.cs 中定义如下:

services.AddAuthorization(options =>
{
    options.AddPolicy("MyPolicy",
        policy =>
        {
            policy.RequireRole("MyRole");
            policy.RequireScope("my-scope");
        }
    );
});

[Authorize]在 2.2 中一切正常,但在迁移到 3.1 并启用端点路由后,当属性存在时,此控制器开始拒绝对任何端点的请求,而不管策略规则如何(重定向到登录页面)。当我删除[Authorize]并查看时User.Claims,我可以看到它确实具有所需的声明(即范围:my-scope,角色:MyRole)。仅当启用端点路由时才会发生这种情况,以防万一使用UseMvc一切正常。端点路由模式下的授权有什么问题?

UPD:该Configure方法如下所示:

public void Configure(IApplicationBuilder app)
{
    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseIdentityServer();
    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints => {
        endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
        endpoints.MapControllers();
        endpoints.MapRazorPages();
    });
}

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

解决方案


在策略定义中明确设置身份验证方案后使其工作:

services.AddAuthorization(options =>
{
    options.AddPolicy("MyPolicy",
        policy =>
        {
            policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme);
            policy.RequireRole("MyRole");
            policy.RequireScope("my-scope");
        }
    );
});

推荐阅读