Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Conflict between System.IdentityModel.Tokens and Microsoft.IdentityModel.Tokens

Tags:

c#

token

jwt

I have a conflict when using System.IdentityModel.Tokens :

using System; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Text;  public voidGenereToken() {     const string sec = "401b09eab3c013d4ca54922bb802bec8fd5318192b0a75f201d8b3727429090fb337591abd3e44453b954555b7a0812e1081c39b740293f765eae731f5a65ed1";     var now = DateTime.UtcNow;     var securityKey = new InMemorySymmetricSecurityKey(Encoding.Default.GetBytes(sec));     var signingCredentials = new SigningCredentials(securityKey,             SecurityAlgorithms.RsaSha256Signature, SecurityAlgorithms.Sha256Digest);      var header = new JwtHeader(signingCredentials);      var payload = new JwtPayload     {         {"iss", "a5fgde64-e84d-485a-be51-56e293d09a69"},         {"scope", "https://example.com/ws"},         {"aud", "https://example.com/oauth2/v1"},         {"iat", now},     };      var secToken = new JwtSecurityToken(header, payload);      var handler = new JwtSecurityTokenHandler();     var tokenString = handler.WriteToken(secToken);     Console.writeLine(tokenString) } 

I get following error when I create header (var header = new JwtHeader(signingCredentials);) :

Argument type 'System.IdentityModel.Tokens.SigningCredentials' is not assignable to parameter type 'Microsoft.IdentityModel.Tokens.SigningCredentials'

I don't understand because all my type refers to System.IdentityModel.Tokens. and in documentation JwtHeader Constructor need System.IdentityModel.Tokens.SigningCredentials

I don't know what's wrong ...

like image 843
Cooxkie Avatar asked Jul 12 '16 20:07

Cooxkie


2 Answers

System.IdentityModel.Tokens.Jwt version 5.0.0.0 depends on Microsoft.IdentityModel.Tokens.

You need to use SigningCredentials in the Microsoft.IdentityModel.Tokens namespace.

Example:

using System; using System.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Text;  public void voidGenereToken() {     const string sec = "401b09eab3c013d4ca54922bb802bec8fd5318192b0a75f201d8b3727429090fb337591abd3e44453b954555b7a0812e1081c39b740293f765eae731f5a65ed1";     var now = DateTime.UtcNow;     var securityKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(Encoding.Default.GetBytes(sec));     var signingCredentials = new Microsoft.IdentityModel.Tokens.SigningCredentials(         securityKey,         SecurityAlgorithms.HmacSha256Signature);      var header = new JwtHeader(signingCredentials);      var payload = new JwtPayload     {             {"iss", "a5fgde64-e84d-485a-be51-56e293d09a69"},             {"scope", "https://example.com/ws"},             {"aud", "https://example.com/oauth2/v1"},             {"iat", now},         };      var secToken = new JwtSecurityToken(header, payload);      var handler = new JwtSecurityTokenHandler();     var tokenString = handler.WriteToken(secToken);     Console.WriteLine(tokenString); } 
like image 154
Emilio Brandon Flanagan Avatar answered Sep 22 '22 01:09

Emilio Brandon Flanagan


May be you are using Jwt version 5.0.0.0 or above. I have faced the same issue before.

The new version of JWT handler accepts Microsoft.IdentityModel.Tokens namespace.

var tokenDescriptor = new Microsoft.IdentityModel.Tokens.SecurityTokenDescriptor             {                 Subject = claimsIdentity,                 Audience = allowedAudience,                 Issuer = issuerName,                 Expires = DateTime.MaxValue,                 SigningCredentials = new Microsoft.IdentityModel.Tokens.SigningCredentials(                     new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(symmetricKey), //symmetric key                     System.IdentityModel.Tokens.SecurityAlgorithms.HmacSha256Signature,                     System.IdentityModel.Tokens.SecurityAlgorithms.Sha256Digest)             };              var tokenHandler = new JwtSecurityTokenHandler();             var token = tokenHandler.CreateToken(tokenDescriptor); 
like image 43
SharmaPattar Avatar answered Sep 23 '22 01:09

SharmaPattar