3

Как добраться SecurityToken от ClaimsPrincipal?Как получить SecurityToken из ClaimsPrincipal?

Мне нужно это, потому что я хочу передать его из приложения MVC в службу WCF в AuthenticationManager/Authenticate.

В методе Authenticate значение BootstrapContext равно null. И даже после аутентификации он иногда получает нуль, что делает его не надежным выбором для меня.

Это мой класс менеджер аутентификации:.

общественного переопределение ClaimsPrincipal Authenticate (строка ResourceName, ClaimsPrincipal incomingPrincipal) { строка passportID = incomingPrincipal.Identity.GetPassportID() ToString();

try 
{ 
    // I need the token here 
    SecurityToken token = GetToken(incomingPrincipal); 
    return base.Authenticate(resourceName, incomingPrincipal); 
} 
catch (Exception ex) 
{ 
    throw new SecurityException("User is not authenticated.", ex); 
} 

}

ответ

2

Я закончил с использованием этого кода:

BootstrapContext context = ClaimsPrincipal.Current.Identities.First().BootstrapContext as BootstrapContext; 
SecurityToken token = context.SecurityToken; 

if (context.SecurityToken != null) 
{ 
    token = context.SecurityToken; 
} 
else if (String.IsNullOrWhiteSpace(context.Token) == false) 
{ 
    var handlers = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.SecurityTokenHandlers; 
    token = handlers.ReadToken(new XmlTextReader(new StringReader(context.Token))); 
} 

var actAsToken = GetActAsToken(token); 

Вы можете прочитать об этом в this SO вопрос. Похоже, что context.SecurityToken в какое-то время будет очищено, поэтому на это нельзя сильно зависеть.

+0

Спасибо pepo .. Просто интересно, есть ли способ получить GetActAsToken из IdP, не создавая его локально снова. Я использую Thinktecture. – Homam

+1

Я сохранил токен ActAs в кеше памяти. Я установил истечение срока действия объекта (токена) в кеш за некоторое время до фактического истечения токена. Затем, если я не нашел токен ActAs для некоторого пользователя, я снова запросил его у IdP. Это сработало для меня, и по сей день у меня не было никаких проблем с этим. – pepo

0
<identityConfiguration saveBootstrapContext="true"> 

Это сохранит токен бутстрапа в ClaimsPrincipal.BootstrapContext.

Смежные вопросы