首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用X509Certificate2 (JwtSecurityTokenHandler)保护JWT

用X509Certificate2 (JwtSecurityTokenHandler)保护JWT
EN

Stack Overflow用户
提问于 2013-08-03 10:52:07
回答 1查看 13.4K关注 0票数 17

我设法使JwtSecurityTokenHandlerX509Certificate2一起工作。我能够用X509Certificate2对象对令牌进行签名。我还能够通过X509Certificate2.RawData属性使用证书的原始数据来验证令牌。

以下是代码:

代码语言:javascript
复制
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令牌,但是不能使用相同的证书创建新的令牌。

EN

回答 1

Stack Overflow用户

发布于 2013-08-03 11:07:33

您必须公开公钥,您可以通过右键单击证书并在MMC上进行导出(不包括私钥)。那么,无论谁必须验证令牌,都会执行以下操作:

代码语言:javascript
复制
 var x509 = new X509Certificate2(pathToExportedCert);

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18032038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档