1

SessionSecurityToken을 디코딩 할 수 있습니까?SessionSecurityToken을 디코딩하는 방법

나는 ThinkTecture IdentityServer으로 작업 할 사이트를 MachineKeySessionSecurityTokenHandler을 사용하여 설정했으며 모든 것이 예상대로 작동합니다.
하지만 토큰을 다른 서비스로 전달해야하지만 쿠키 대신 Authorization HTTP 헤더가 필요합니다.

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

답변

1

이 솔루션을 찾을 수 던졌습니다 :

나는 다음과 같은 시도했습니다.

전선을 통해 데이터를 전송하는 유일한 방법은 SessionSecurityTokenJwtSecurityToken으로 변환하고 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)); 
} 
관련 문제