我正在使用 Azure AD/Entra 进行 OIDC 身份验证:
services
.AddAuthentication()
.AddMicrosoftIdentityWebApp(
configuration.GetSection("AzureAd"),
openIdConnectScheme: "MySchemeName",
cookieScheme: null,
displayName: "MySchemeName");
我的应用程序注册已定义应用程序角色,并分配给用户。
在我的
ChallengeResult
回调中,我可以将角色视为从 ExternalLoginInfo
方法返回的 Principal.Claims
属性中的 signInManager.GetExternalLoginInfoAsync()
对象中的声明。很明显,令牌中的角色是正确的。
但是,我的政策定义为:
options.AddPolicy("MyPolicy", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireClaim(ClaimTypes.Role, "AzureAppRoleName");
});
当我导航到此策略定义为
[Authorize(Policy = "MyPolicy")]
的页面时,我收到 403。
如果我在某些自定义中间件中设置断点,我可以看到
HttpContext.User
有一些声明,但没有角色声明。
如何确保令牌中返回的角色声明被分配给委托人?
请参阅下面的代码,当我使用
mypolicy
时一切正常,但如果我在控制器操作方法中使用 [Authorize(Policy = "mypolicy2")]
,我会遇到访问被拒绝的问题。
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("mypolicy", policy => policy.RequireRole("Tiny.AccessEndpoint"));
//options.AddPolicy("mypolicy2", policy => policy.RequireClaim(ClaimTypes.Role, "Tiny.AccessEndpoint"));
});
所以恐怕你应该将
policy.RequireClaim(ClaimTypes.Role
更改为 policy.RequireRole