c# - 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();
});
}
解决方案
在策略定义中明确设置身份验证方案后使其工作:
services.AddAuthorization(options =>
{
options.AddPolicy("MyPolicy",
policy =>
{
policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme);
policy.RequireRole("MyRole");
policy.RequireScope("my-scope");
}
);
});
推荐阅读
- java - 如何找到eclipse内置的代码示例
- vba - 在VBA中格式化为字符串时的时间比较?
- coq - 在 coq 中获取最小值的函数
- signalr.client - Signalr .net 核心客户端中的异步处理程序
- svg - SVG 在 IE 11 中重复两次,在 Chrome 中运行良好
- ruby-on-rails-5 - 是否可以删除 ActiveRecord 关系的“默认”WHERE 规则?
- mysql - 来自不同行(具有相同日期)数据的日期表的 GROUP 结果
- javascript - Express Body-parser 文件上传大小限制不起作用
- java - 如何返回程序的开头 - java
- hadoop - 从包含 Map(retweet -> 0,loc -> none) 形式的数据的文件创建一个配置单元表