16

JwtSecurityTokenHandlerで作品を作ることができましたX509Certificate2X509Certificate2オブジェクトでトークンに署名できました。X509Certificate2.RawDataプロパティを介して証明書の生データを使用して、トークンを検証することもできました。

コードは次のとおりです。

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. 消費者が JWT トークンを検証する必要あるが、同じ証明書を使用して新しいトークンを作成できないようにするには、X509Certificate2 のどの部分を明らかにする必要がありますか?

4

1 に答える 1

6

証明書を右クリックして取得できる公開鍵を公開し、MMC でエクスポート (秘密鍵を含めないでください) する必要があります。次に、トークンを検証する必要がある人は誰でもそうします

 var x509 = new X509Certificate2(pathToExportedCert);

または、バイト配列 ctor を使用して公開鍵を base64 でエンコードすることもできます。

于 2013-08-03T11:07:33.600 に答える