BootstrapContext является нулевым на ClaimsIdentity
Я создал новое приложение ASP.NET MVC с.NET 4.5. Я успешно настроил аутентификацию с помощью STS. Процесс проверки подлинности работает нормально, и я могу получить ClaimsIdentity, содержащий требуемые утверждения, на Thread.CurrentPrincipal.
Теперь мне нужен токен начальной загрузки для защиты вызовов на моем сервисном уровне. Я установил для saveBootstrapContext значение true для элемента identityConfiguration.
<system.identityModel>
<identityConfiguration saveBootstrapContext="true">
Однако свойство BootstrapContext в ClaimsIdentity всегда имеет значение null.
var identity = Thread.CurrentPrincipal.Identity as ClaimsIdentity;
var context = identity.BootstrapContext; // context is always null
Я что-то здесь упускаю? Это должно было быть просто:(
----------- Решено ------------
Эта проблема устранена после перезагрузки системы. Обратите внимание, что это не разрешается после iisreset. Позже я изменил конфигурацию, чтобы использовать Microsoft.IdentityModel вместо System.IdentityModel. Я смог воспроизвести это поведение. После очередной перезагрузки я смог получить токен начальной загрузки еще раз. Кто-нибудь еще испытывает такое же поведение?
4 ответа
Решил это этим:
<system.identityModel>
<identityConfiguration saveBootstrapContext="true" />
</system.identityModel>
Также необходимо установить TokenValidationParameters.SaveSigninToken
, который отличается от JwtBearerOptions.SaveTokens:
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions {
Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
TokenValidationParameters = new TokenValidationParameters {
SaveSigninToken = true,
ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
}
}
);
Я столкнулся с этой проблемой при размещении в IIS Express. Оказывается, проблема была в моем браузере - я не закрыл все окна своего браузера или не удалил куки, поэтому SessionSecurityToken не воссоздаётся с новым параметром, даже если сервер был перезапущен (существующий куки-файл FedAuth все еще использовался отправлено из браузера).
После принудительной повторной аутентификации, закрыв все окна браузера, перезапустив браузер и снова выполнив мой запрос, появился BootstrapContext.
Если вы используете обработчик сообщений для ручной проверки токена с помощью JwtSecurityTokenHandler
извлечь принципал утверждений и присоединить его к текущему потоку, как описано здесь в разделе Использование обработчика JWT для реализации делегирования /ActAs "Бедного человека", когда вы проверяете токен с помощью JwtSecurityTokenHandler.ValidateToken()
одна из настроек на TokenValidationParameters
является SaveBootstrapContext
, установив, что true
делает трюк.
Я использую Microsoft.AspNetCore.Authentication.OpenIdConnect, Version=5.0.4.0, и настройка такова:
.AddOpenIdConnect(o =>
{
// . . .
o.TokenValidationParameters.SaveSigninToken = true;
})