如何从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);
    }
}

最佳答案

我最终使用了以下代码:

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将在一段时间内被清除,因此不能太依赖它。

10-07 12:52