2013-08-03 2 views
14

JwtSecurityTokenHandlerX509Certificate2과 함께 사용할 수 있도록 관리했습니다. 나는 X509Certificate2 객체로 토큰에 서명 할 수있었습니다. X509Certificate2.RawData 속성을 통해 인증서의 원시 데이터를 사용하여 토큰의 유효성을 검사 할 수도있었습니다. 여기 X509Certificate2 (JwtSecurityTokenHandler)를 사용하여 JWT 보안

코드입니다 :

class Program 
{ 
    static void Main(string[] args) 
    { 
     X509Store store = new X509Store("My"); 
     store.Open(OpenFlags.ReadOnly); 
     X509Certificate2 signingCert = store.Certificates[0]; 

     string token = CreateTokenWithX509SigningCredentials(signingCert); 
     ClaimsPrincipal principal = ValidateTokenWithX509SecurityToken(
      new X509RawDataKeyIdentifierClause(signingCert.RawData), token); 
    } 

    static string CreateTokenWithX509SigningCredentials(X509Certificate2 signingCert) 
    { 
     var now = DateTime.UtcNow; 
     var tokenHandler = new JwtSecurityTokenHandler(); 
     var tokenDescriptor = new SecurityTokenDescriptor 
     { 
      Subject = new ClaimsIdentity(new Claim[] 
        { 
         new Claim(ClaimTypes.Name, "Tugberk"), 
         new Claim(ClaimTypes.Role, "Sales"), 
        }), 
      TokenIssuerName = "self", 
      AppliesToAddress = "http://www.example.com", 
      Lifetime = new Lifetime(now, now.AddMinutes(2)), 
      SigningCredentials = new X509SigningCredentials(signingCert) 
     }; 

     SecurityToken token = tokenHandler.CreateToken(tokenDescriptor); 
     string tokenString = tokenHandler.WriteToken(token); 

     return tokenString; 
    } 

    static ClaimsPrincipal ValidateTokenWithX509SecurityToken(X509RawDataKeyIdentifierClause x509DataClause, string token) 
    { 
     var tokenHandler = new JwtSecurityTokenHandler(); 
     var x509SecurityToken = new X509SecurityToken(new X509Certificate2(x509DataClause.GetX509RawData())); 
     var validationParameters = new TokenValidationParameters() 
     { 
      AllowedAudience = "http://www.example.com", 
      SigningToken = x509SecurityToken, 
      ValidIssuer = "self", 
     }; 

     ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(
      new JwtSecurityToken(token), validationParameters); 

     return claimsPrincipal; 
    } 
} 

내 주요 질문은 모두 내 X509Certificate2에서 세계에 노출해야하는지에 관한 것입니다. X509Certificate2의 어느 부분을 공개해야합니까? 소비자는 JWT 토큰을 확인해야합니다. 그러나 은 동일한 인증서를 사용하여 새 토큰을 만들 수 없습니다?

답변

6

인증서를 마우스 오른쪽 단추로 클릭하고 MMC에 내보내기 (개인 키 포함 안 함) 할 수있는 공개 키를 노출해야합니다. 그리고 누구는 토큰이

var x509 = new X509Certiicate2(pathToExportedCert); 

을 할 것이다 또는 당신은 또한 바이트 배열의 ctor를 사용하고 base64로 인코딩 된 공개 키를 가질 수 있습니다 확인해야한다.

+0

감사합니다. 나는 X509Certiicate2.RawData를 공개하려고 생각하고 있었고 개인 키가 포함되어 있지 않다고 가정합니다. 내가 맞습니까? 다른 인증서의 RawDate를 전달하여 새 X509Certiicate2 개체를 만들 때 새로운 인증서에 토큰에 서명하는 데 사용되는 개인 키가 있다는 것을 알 수 없습니다. – tugberk

+0

예. 'RawData'는 base64로 인코딩 된 X509 인증서 데이터입니다. 여기에 표시된대로 인증서를 내보내는 것과 동일합니다! [] (http://puu.sh/3SFr4.png). 차이점은 RawData는'---- BEGIN/END CERT ... '헤더와 crlf를 포함하지 않는다는 것입니다. 그런데 사용 사례는 무엇입니까? 크로스 플랫폼에서 작동하는 것을 원한다면 소비자에게 헤더와 crlf를 포함하여 인 코드 된 코드를 제공 할 것을 제안합니다. – woloski