Мое одностраничное приложение использует OidcTokenManager для подключения к IdentityServer3 STS с использованием неявного потока. Клиент представляет токен доступа IDS3 веб-службе ASP.NET Core (WebApi) как токен-носитель; приложение веб-службы настроено для использования промежуточного программного обеспечения IDS3 и ограничивает доступ к своим методам с помощью атрибута авторизации.
Конфигурация клиента SPA:
function configureTokenManager() {
console.log("configureTokenManager()");
var config = {
authority: $config.authority,
client_id: "BNRegistry",
redirect_uri: $config.webRoot + "/#/authorised/",
post_logout_redirect_uri: $config.webRoot + "/#/",
response_type: "id_token token",
scope: "openid profile email BNApi",
silent_redirect_uri: $config.webRoot + "/#/renew/",
silent_renew: true,
filter_protocol_claims: false
};
return new OidcTokenManager(config);
};
Конфигурация области в STS:
new Scope
{
Name = "BNApi",
DisplayName = "BN Api",
Enabled = true,
Type = ScopeType.Resource,
Claims = new List<ScopeClaim>
{
new ScopeClaim(Constants.ClaimTypes.Name),
new ScopeClaim(Constants.ClaimTypes.Role)
}
}
Конфигурация WebApi:
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = Configuration["Authority"],
RequiredScopes = new[] {"BNApi"},
NameClaimType = IdentityModel.JwtClaimTypes.Name,
RoleClaimType = IdentityModel.JwtClaimTypes.Role
});
Метод WebApi:
[Authorize]
public IActionResult Get()
{
...
}
Это работает, как ожидалось, отклоняя неаутентифицированного пользователя с 401. Если я исследую утверждения для пользователя в методе контроллера api (например, User.Claims.ToList()
), он содержит записи для любых ролей, которым был назначен пользователь.
Однако, если я проверяю свойство User.Identity.Name
, оно всегда равно нулю, а если я запрашиваю User.IsInRole("Administrator")
, оно всегда ложно, даже когда пользователю назначена эта роль. Кроме того, если я добавлю имя роли к атрибуту Authorize
([Authorize(Role="Administrator")]
), пользователи будут отклонены с кодом 401 независимо от того, принадлежат они к указанной роли или нет.
Как я могу заставить IdentityServer3 нормально работать с авторизацией ролей ASP.NET?