2016-03-21 9 views
0

erhalten Ich versuche JWT Authentifizierung in .NET zu verwenden, und ich brauche, um das Ergebnis wie folgt aussehen:Kann nicht Signatur von JwtSecurityToken

Rubrik: {"alg":"HS512"}

Nutzlast:

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

ich schrieb den follwoing Code die JWT Signed Token zu erhalten:

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; 
      } 

Mit diesem Code bekomme ich nur den Header und Payload verschlüsselt, ich bekomme keine Signatur. Ich habe mir viele Orte angesehen, konnte aber kein Beispiel finden, das ähnliche Nutzdaten und Header erzeugt.

1- Wie kann ich die Signing Credentials zu toeken hinzufügen; SigningCredentials, SigningToken und SigningKeys können nicht festgelegt werden. Nicht sicher, wo die Anmeldedaten passen sollten.

2- wie wird die Signatur hergestellt?

Antwort

1

Der folgende Code zeigt, wie Sie ein JWT-Token erstellen können, wobei "Certificate" ein selbstsigniertes Zertifikat sein kann.

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) }); 
    }