Я использую 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
в токене доступа у нас есть утверждение
roles, ноClaimTypes.Roleуказывает наhttp://schemas.microsoft.com/ws/2008/06/identity/claims/role, что может быть не тем, что нам нужно.