16

我设法JwtSecurityTokenHandlerX509Certificate2. 我能够用一个X509Certificate2对象签署令牌。我还能够通过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. 我应该透露 X509Certificate2 的哪一部分,以便消费者应该验证 JWT 令牌不能使用相同的证书创建新令牌

4

1 回答 1

6

您必须公开您可以通过右键单击证书获取的公钥并在 MMC 上执行导出(不包括私钥)。然后任何必须验证令牌的人都会做

 var x509 = new X509Certificate2(pathToExportedCert);

或者您也可以使用字节数组 ctor 并将公钥编码为 base64。

于 2013-08-03T11:07:33.600 回答