.net 如何从ClaimsPrincipal获取SecurityToken?
如何从.net 如何从ClaimsPrincipal获取SecurityToken?,.net,authentication,identity,claims-based-identity,federated-identity,.net,Authentication,Identity,Claims Based Identity,Federated Identity,如何从ClaimsPrincipal获取SecurityToken 我需要它,因为我想将它从MVC应用程序传递到中的WCF服务 在Authenticate方法中,BootstrapContext的值为null。即使在认证之后,有时它也会变为null,这使得它对我来说不是一个可靠的选择 这是我的身份验证管理器类: public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPri
ClaimsPrincipal
获取SecurityToken
我需要它,因为我想将它从MVC应用程序传递到中的WCF服务
在Authenticate方法中,BootstrapContext的值为null。即使在认证之后,有时它也会变为null,这使得它对我来说不是一个可靠的选择
这是我的身份验证管理器类:
public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
{
string 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);
}
}
我最终使用了以下代码:
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);
你可以阅读更多关于它的问题。似乎context.SecurityToken
将在一段时间内被清除,因此人们不能过分依赖它。
<identityConfiguration saveBootstrapContext="true">
这将在ClaimsPrincipal.BootstrapContext中保存引导令牌。谢谢pepo。。只是想知道是否有一种方法可以从IdP获取GetActAsToken,而无需在本地再次生成它。我正在使用Thinktecture。我将ActAs令牌存储在内存缓存中。我在缓存中设置了对象(令牌)在实际令牌到期之前的某个时间的到期时间。然后,如果我没有找到某个用户的ActAs令牌,我会再次从IdP请求它。它对我很有效,直到今天我都没有任何问题。