从ClaimsPrincipal中获取SecurityToken的方法是什么?

4

如何从ClaimsPrincipal获取SecurityToken

我需要它,因为我想在AuthenticationManager / Authenticate中从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);
    }
}
2个回答

3
我最终使用了这段代码:
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);

您可以在这个SO问题中了解更多相关信息。看起来context.SecurityToken会在一段时间后被清除,因此不能太依赖它。


谢谢Pepo.. 我只是想知道是否有一种方法可以从IdP获取GetActAsToken而不必再次在本地生成它。我正在使用Thinktecture。 - Homam
1
我将ActAs令牌存储在内存缓存中。我在实际令牌过期之前的一段时间设置了缓存对象(令牌)的过期时间。然后,如果我没有找到某个用户的ActAs令牌,我会再次从IdP请求它。这对我很有效,并且直到今天我都没有遇到任何问题。 - pepo

0
<identityConfiguration saveBootstrapContext="true">

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接