Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何从ClaimsPrincipal获取SecurityToken?_.net_Authentication_Identity_Claims Based Identity_Federated Identity - Fatal编程技术网

.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请求它。它对我很有效,直到今天我都没有任何问题。