【问题标题】:How to decode SessionSecurityToken如何解码 SessionSecurityToken
【发布时间】:2013-10-19 06:20:45
【问题描述】:

是否可以解码SessionSecurityToken

我已经使用MachineKeySessionSecurityTokenHandler 建立了一个与ThinkTecture IdentityServer 合作的网站,并且一切正常。
但现在我需要将令牌传递给另一个服务,但在 Authorization HTTP 标头而不是 cookie 中。

我尝试了以下方法:

var cookie = HttpContext.Current.Request.Cookies[FederatedAuthentication.FederationConfiguration.CookieHandler.Name];

if (cookie != null)
{
    var t = MachineKey.Unprotect(Convert.FromBase64String(cookie.Value), "System.IdentityModel.Services.MachineKeyTransform");
}

但这会引发System.Security.Cryptography.CryptographicException

【问题讨论】:

    标签: .net-4.5 wif thinktecture-ident-server thinktecture-ident-model


    【解决方案1】:

    找到了解决办法。

    通过网络发送数据的唯一(简单)方法是将SessionSecurityToken 转换为JwtSecurityToken 并使用RawData 属性。

    示例实现(依赖于ThinkTecture.IdentityModel):

    public JwtSecurityToken ConvertSessionToJsonWebSecurityToken(SessionSecurityToken sessionToken)
    {
        var h = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.SecurityTokenHandlers[typeof(JwtSecurityToken)] as JwtSecurityTokenHandler;
    
        if (h != null)
        {
            var issuer = ((ValidatingIssuerNameRegistry)h.Configuration.IssuerNameRegistry).IssuingAuthorities.First().Name;
            var audience = h.Configuration.AudienceRestriction.AllowedAudienceUris.First().AbsoluteUri;
            var signingKey = ((ValidatingIssuerNameRegistry)h.Configuration.IssuerNameRegistry).IssuingAuthorities.First().SymmetricKeys.First();
            var securityKey = ((NamedKeyIssuerTokenResolver)h.Configuration.IssuerTokenResolver).SecurityKeys.First().Value.First();
    
            // Create token
            var t = h.CreateToken(
                null,
                null,
                (ClaimsIdentity)sessionToken.ClaimsPrincipal.Identity,
                new Lifetime(sessionToken.ValidFrom, sessionToken.ValidTo),
                new SigningCredentials(
                    securityKey,
                    Algorithms.HmacSha256Signature,
                    Algorithms.Sha256Digest));
    
            // Serialize token for validaiton
            var s = h.WriteToken(t);
    
            // Validate token
            var validationParameters = new TokenValidationParameters()
            {
                AllowedAudience = audience,
                ValidIssuer = issuer,
                SigningToken = new BinarySecretSecurityToken(Convert.FromBase64String(signingKey))
            };
    
            h.ValidateToken(s, validationParameters);
    
            // Return token with correct type
            return h.ReadToken(s) as JwtSecurityToken;
        }
    
        return null;
    }
    
    [Test]
    public void GetToken_WhenValidSessionTokenExist_ShouldReturnValidJwtToken()
    {
        JwtSecurityToken c;
        FederatedAuthentication.SessionAuthenticationModule.TryReadJwtTokenFromCookie(container.GetInstance<ISecurityTokenOperations>(), out c)
    
        Assert.That(!string.IsNullOrEmpty(c.RawData));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 2012-10-05
      • 2020-07-27
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多