如何从ClaimsPrincipal获取SecurityToken?

时间:2014-11-07 12:44:32

标签: .net authentication identity claims-based-identity federated-identity

如何从SecurityToken获取ClaimsPrincipal

我需要它,因为我想将它从MVC应用程序传递到AuthenticationManager / Authenticate中的WCF服务。

在Authenticate方法中,值BootstrapContext为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);
}

}

2 个答案:

答案 0 :(得分: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在某些时候会被清除,所以人们不能过分依赖它。

答案 1 :(得分:0)

<identityConfiguration saveBootstrapContext="true">

这将保存ClaimsPrincipal.BootstrapContext中的引导令牌。