我正在尝试将我的项目从 .UseMVC (asp.net core 2.2 兼容样式)升级到 .UseEndpoint Routing,并且我的所有请求都被重定向到我的验证失败页面。它与声明有关 - 如果我删除 [Authorize(Roles = "Admin")] 的角色部分以简单地 [Authorize],那么它就可以工作。它似乎没有获取分配给用户的声明。
这似乎是一个非常相似的问题AuthorizeAttribute 不适用于 ASP.NET Core 3.1 中的端点路由 https://stackoverflow.com/q/60388730/5683904
以下段落摘自链接帖子但进行了修改以反映我的问题版本
在 2.2 中一切正常,但在迁移到 3.1 并启用后
端点路由,该控制器开始拒绝对任何端点的请求
当存在 [Authorize(Roles = "Admin")] 属性时的端点。当我删除时
“Roles =”部分并查看 User.Claims,我可以看到它确实有
所需的声明/角色。有时候是这样的
仅当启用端点路由时,在使用 UseMvc 的情况下
一切正常。端点授权有什么问题
路由模式?
摘自 Startup.cs
app.UseSession();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseResponseCompression();
//Add the users Roles as claims to his identity so that it is picked up for authentication purposes
app.Use((context, next) =>
{
var userId = context.User.Identity.Name;
if (userId == null)
{
return next();
}
...
var roles = resourceDataAccess.GetRolesForUser(userId);
if (roles != null)
{
var claims = roles.Select(role => new Claim(ClaimTypes.Role, role.RoleEnum.ToString())).ToList();
var appIdentity = new ClaimsIdentity(claims);
context.User.AddIdentity(appIdentity);
}
return next();
});
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<AppHub>("api/apphub");
endpoints.MapControllerRoute("default", "api/{controller=Account}/{action=SignIn}/{id?}");
endpoints.MapControllerRoute("catch-all", "api/{*url}",
new {controller = "Utility", action = "NotFoundPage"});
});
事实证明,由于我们使用 app.Use() 中间件从数据库填充用户角色,因此需要在 UseAuthorization 之前调用它,以便在执行授权之前加载角色。 (就像@CamiloTerevinto 的评论)
app.UseSession();
app.UseRouting();
app.UseAuthentication();
//Add the users Roles as claims to his identity so that it is picked up for authentication purposes
app.Use((context, next) =>
{
...
}
//Setup the authorisation middleware to run only after we have loaded the users roles.
app.UseAuthorization();
app.UseResponseCompression();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)