如何为我的JWT创建签名?

时间:2016-03-15 19:27:28

标签: c# encryption jwt box

根据JWT(特别是使用Box.com api),你需要

  1. 创建标题和声明,base 64 url​​对它们进行编码,用点连接它们。

  2. You then need to take that and the secret key (a little confusion here, more on that in a second) and then encrypt them。对于Box.com,它将使用RS256。

  3. 然后你把它发送给提供者(再次,在这种情况下是Box.com),一切都应该很好,花花公子。

  4. 我有第1步没问题。

    步骤2对我来说有点问题。

    1. 我假设我使用了我的私钥?编辑:不,私钥是解密。

    2. 虽然使用HSA这样做的例子太多了,但是我需要使用RSA和System.IdentityModel.Tokens.JWT_stuff过程并不是很有帮助。如果Box.com允许使用HSA256,我可以使用其他几个包和库。

    3. 我已经看了this question,但它并没有给你带来过多的帮助。

      那么我需要做些什么才能完成第2步?换句话说:如何在C#中使用RSA256进行加密?

1 个答案:

答案 0 :(得分:1)

快速查看GitHub上的Box.com's developer page指向Box .NET SDK by Box Mobile Team,其中有一个BoxJWTAuth.cs,其中包含一些代码,您可以查看他们使用RSA的位置。

甚至还有Box.V2.Samples.JWTAuth/Program.cs显示如何使用它。

在检查BoxJWTAuth时,我看到了这段代码

private string ConstructJWTAssertion(string sub, string boxSubType)
{
    byte[] randomNumber = new byte[64];
    using (var rng = new RNGCryptoServiceProvider())
    {
        rng.GetBytes(randomNumber);
    }

    var claims = new List<Claim>{
        new Claim("sub", sub),
        new Claim("box_sub_type", boxSubType),
        new Claim("jti", Convert.ToBase64String(randomNumber)),
    };

    var payload = new JwtPayload(this.boxConfig.ClientId, AUTH_URL, claims, null, DateTime.UtcNow.AddSeconds(30));

    var header = new JwtHeader(signingCredentials: this.credentials);
    if (this.boxConfig.JWTPublicKeyId != null)
        header.Add("kid", this.boxConfig.JWTPublicKeyId);

    var token = new JwtSecurityToken(header, payload);
    var tokenHandler = new JwtSecurityTokenHandler();
    string assertion = tokenHandler.WriteToken(token);
    return assertion;
}

希望这有帮助。