2013-08-03 14 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

関連する問題