【发布时间】:2022-01-01 16:28:38
【问题描述】:
在我的应用中,我使用以下代码验证和授权Windows Authentication 的每个请求:
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate();
builder.Services.AddAuthorization(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.RequireRole("DevOps-Admin")
.Build();
options.AddPolicy(PolicyNames.IsDevOpsAdmin, policy);
options.FallbackPolicy = policy;
});
现在我必须额外支持Basic Authentication,但只是针对特定的 API 控制器。所以我尝试通过策略(as described here)设置认证方案。但是当我将代码更改为以下时,它不再起作用,它返回 403 - 禁止:
builder.Services.AddAuthentication().AddNegotiate();
builder.Services.AddAuthorization(options =>
{
var policy = new AuthorizationPolicyBuilder(NegotiateDefaults.AuthenticationScheme)
.RequireAuthenticatedUser()
.RequireRole("DevOps-Admin")
.Build();
options.AddPolicy(PolicyNames.IsDevOpsAdmin, policy);
options.FallbackPolicy = policy;
});
输出显示:
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
RolesAuthorizationRequirement:User.IsInRole must be true for one of the following roles: (DevOps-Admin)
我希望两个代码 sn-ps 做的完全一样?
我的想法是,如果我可以更改代码以便策略选择身份验证方案,我可以添加另一个具有“基本”方案的策略,然后执行基本身份验证和授权。然后我可以将属性Authorize 添加到我的控制器并将策略设置为新的。
做了很多谷歌搜索并观看了有关身份验证和授权的 Pluralsight 课程,但我似乎仍然不明白:(
更新 1:
如果我在第二个代码 sn-p 中注释掉 .RequireRole("DevOps-Admin") 行,它就可以工作。这很奇怪,因为当我查看声明时,每个广告组都在那里,包括DevOps-Admin,那么为什么在这种情况下RequireRole 返回false?
【问题讨论】:
-
问题解决了吗?
-
不,因为我需要
.RequireRole("DevOps-Admin")行来确保用户具有该特定角色。我只是想缩小问题的范围。
标签: c# asp.net-core authentication asp.net-web-api authorization