Le conflit entre le Système.IdentityModel.Tokens et Microsoft.IdentityModel.Jeton

j'ai un conflit lors de l'utilisation du Système.IdentityModel.Jetons :

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

j'obtiens l'erreur suivante quand je crée l'en-tête (var en-tête = new JwtHeader(signingCredentials);):

Type D'Argument ' System.IdentityModel.Jeton.SigningCredentials " n'est pas assignable au type de paramètre "Microsoft.IdentityModel.Jeton.SigningCredentials'

je ne comprends pas parce que tout mon type se réfère à Système.IdentityModel.Jetons. et dans la documentation Jwtheader Constructor besoin Système.IdentityModel.Jeton.SigningCredentials

Je ne sais pas ce qui ne va pas ...

41
demandé sur TheVillageIdiot 2016-07-12 23:45:08

2 réponses

Système.IdentityModel.Jeton.La version 5.0.0.0 de Jwt dépend de Microsoft.IdentityModel.Jeton.

Vous devez utiliser SigningCredentials dans Microsoft.IdentityModel.Les jetons de l'espace de noms.

Exemple:

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);
}
53
répondu Emilio Brandon Flanagan 2017-02-04 09:28:21

peut être que vous utilisez Jwt version 5.0.0.0 ou plus. J'ai rencontré le même problème avant.

la nouvelle version de JWT handler accepte Microsoft.IdentityModel.Les jetons de l'espace de noms.

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);
5
répondu SharmaPattar 2017-11-19 07:12:33