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;
})
Другие вопросы по тегам