2016-03-21 8 views
0

から署名を取得できません:は、私が.NETでJWT認証を使用しようとしていると私はこのように見える結果を必要JwtSecurityToken

ヘッダー: {"alg":"HS512"}

ペイロード:

{"sub":"SomeSubject","nbf":1458315105,"exp":1458316305,"iat":1458315705} 

私はJWT署名トークンを取得するためのfollwoingコードを書いた:

public async Task<string> GetJWTToken(string user) 
     { 
      var now = DateTime.UtcNow; 

      JwtHeader jwtHeader = new JwtHeader(); 

      jwtHeader.Add("alg", JwtAlgorithms.HMAC_SHA512); 

      JwtPayload payload = new JwtPayload(); 
      payload.Add("sub", user); 
      payload.Add("exp", ConvertToUnixTimestamp(now.AddMinutes(10))); 
      payload.Add("nbf",ConvertToUnixTimestamp(now.AddMinutes(-10))); 
      payload.Add("iat",ConvertToUnixTimestamp(now)); 

      JwtSecurityToken toekn = new JwtSecurityToken(jwtHeader, payload); 
      SigningCredentials cred = new SigningCredentials(new InMemorySymmetricSecurityKey(Encoding.UTF8.GetBytes("SomeKey")), "http://www.w3.org/2001/04/xmldsig-more#hmac-sha512", "http://www.w3.org/2001/04/xmlenc#sha512"); 

      //what's next? 
      return finalResult; 
      } 

このコードでは、ヘッダーとペイロードを暗号化するだけで、署名は得られません。私は多くの場所を見ましたが、同様のペイロードとヘッダーを生成する例は見つかりませんでした。

1-どのように署名資格情報をtoekenに追加できますか。 SigningCredentials、SigningTokenおよびSigningKeysは設定できません。署名の資格情報がどこに適合するかは不明です。

2-その後、署名はどのように生成されますか?

答えて

1

次のコードは、「証明書」が自己署名証明書になるJWTトークンの作成方法を示しています。

public JwtTokenProvider(string authority) 
    { 
     _authority = authority; 
    } 
    public async Task<TokenResult> GetTokenAsync(string clientId, string resource) 
    { 
     return await Task.FromResult(new TokenResult 
     { 
      AccessTokenType = "Bearer", 
      IdToken = CreateJwt(clientId, resource) 
     }); 
    } 
    private string CreateJwt(string clientId, string resource) 
    { 
     var certificate = new X509Certificate2(Resource.notification, CertPassword); 
     var sub = new System.Security.Claims.Claim("sub", clientId); 
     var jti = new System.Security.Claims.Claim("jti", Guid.NewGuid().ToString()); 
     var claims = new List<System.Security.Claims.Claim>() { sub, jti }; 
     var x509Key = new X509AsymmetricSecurityKey(certificate); 
     var signingCredentials = new SigningCredentials(x509Key, SecurityAlgorithms.RsaSha256Signature, 
      SecurityAlgorithms.Sha256Digest); 
     var jwt = new JwtSecurityToken(_authority, resource, claims, 
      DateTime.UtcNow, 
      DateTime.UtcNow.AddMinutes(ExpirationInMinutes), signingCredentials); 
     var sign = new SignatureProviderFactory(); 
     var provider = sign.CreateForSigning(x509Key, SecurityAlgorithms.RsaSha256Signature); 
     var input = string.Join(".", new[] { jwt.EncodedHeader, jwt.EncodedPayload }); 
     var signed = provider.Sign(Encoding.UTF8.GetBytes(input)); 
     sign.ReleaseProvider(provider); 
     return string.Join(".", new[] { jwt.EncodedHeader, jwt.EncodedPayload, Base64UrlEncoder.Encode(signed) }); 
    }