JwtSecurityTokenHandler
をX509Certificate2
で動作させることができました。私は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トークンを検証するようにしますしかしは同じ証明書を使用して新しいトークンを作成できません?
ありがとうございます!私は 'X509Certiicate2.RawData'を公開しようと考えていましたが、私はそれが秘密鍵を含んでいないと仮定します。私は正しい?別の証明書のRawDateを渡して新しいX509Certiicate2オブジェクトを作成すると、新しい証明書にトークンに署名するために使用される秘密鍵があることはわかりません。 – tugberk
はい。 'RawData'はbase64でエンコードされたX509証明書データです。ここに示すように証明書をエクスポートするのと同じです![](http://puu.sh/3SFr4.png)。違いは、RawDataは '---- BEGIN/END CERT ...'ヘッダーとcrlfを含まないことです。あなたのユースケースは何ですか?クロスプラットフォームで動作するものが必要な場合は、これらのヘッダーとcrlfを含めてエンコードされた証明書を消費者に提供することをお勧めします。 – woloski