Я использую 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
, что может быть не тем, что нам нужно.