WSFederation & Manual ClaimsIdentity с AppPool повторяет

У меня есть приложение, которое должно поддерживать как федерацию (инициированную IdP), так и ручную аутентификацию (стандартная форма имени пользователя / пароля). В связи с этим я использую.NET v4.5 System.Identity для информирования о заявках приложения.

Проблема, которую мы наблюдаем в dev, заключается в том, что каждый раз, когда происходит перезапуск AppPool (например, перекомпиляция), и мы перезагружаем страницу или предпринимаем любые другие действия, мы получаем ошибку, пытаясь получить доступ к любому из наших пользовательских утверждений. Это как если бы пользователь все еще проходил аутентификацию, но наши пользовательские требования полностью исчезли. Чтобы продолжить работу, нам нужно закрыть все экземпляры браузера и войти снова. Это, очевидно, может произойти в условиях дикой природы, и мы не можем этого добиться (ужасный опыт конечного пользователя).

Есть ли что-то, что мы делаем неправильно, или способ, которым мы можем перехватить / обнаружить это условие и заставить пользователя снова войти в систему?

Фон

В случае ручного входа в систему мы создаем экземпляр CustomClaimsIdentity, который передается в новый ClaimsPrincipal, который затем используется для создания нового экземпляра SessionSecuirytToken, а затем записывается следующим образом:

var claims = CustomClaimsAuthenticationManager.BuildClaimsList( user );
var identity = new UniversalIdentity( claims, AuthenticationTypes.Password );
var principal = new ClaimsPrincipal( identity );
var token = new SessionSecurityToken( principal, TimeSpan.FromMinutes( user.Customer.SessionExp ?? 120 ) );
var sam = FederatedAuthentication.SessionAuthenticationModule;
sam.WriteSessionTokenToCookie( token );

В случае инициированных Idp входов в систему мы обрабатываем событие FederatedAuthentication.WSFederationAuthenticationModule.SignedIn и выполняем проверки для проверки предоставленных утверждений, а также для создания пользовательских утверждений, которые наше приложение добавляет к идентификатору так же, как мы делаем для ручной аутентификации.

1 ответ

Решение

Вы можете спокойно бросить IPrincipal в ClaimsPrincipal:

ClaimsPrincipal cp = (ClaimsPrincipal)Thread.CurrentPrincipal;
Другие вопросы по тегам