2016-07-06 13 views
11

Sto provando a utilizzare il pacchetto System.IdentityModel.Tokens.Jwt per generare un token. Ho trovato alcuni esempi di codice online, era piuttosto semplice, ma poi mi imbatto in un errore che non riesco a capire. Ecco il codice che sto usando (è stato leggermente modificato per brevità):Errore durante il tentativo di generare token utilizzando la libreria JWT .NET

<%@ Application Language="C#" %> 
<%@ Import Namespace="System" %> 
<%@ Import Namespace="System.Text" %> 
<%@ Import Namespace="System.Reflection" %> 
<%@ Import Namespace="System.Collections" %> 
<%@ Import Namespace="System.IdentityModel.Tokens" %> 
<%@ Import Namespace="System.IdentityModel.Tokens.Jwt" %> 
<%@ Import Namespace="System.Security.Claims" %> 
<%@ Import Namespace="System.IdentityModel.Protocols.WSTrust" %> 

<script runat="server"> 
    public class TestClass 
    { 
     public static string GetJwtToken() 
     { 
      var tokenHandler = new JwtSecurityTokenHandler(); 
      var input = "anyoldrandomtext"; 
      var securityKey = new byte[input.Length * sizeof(char)]; 
      Buffer.BlockCopy(input.ToCharArray(), 0, securityKey, 0, securityKey.Length); 
      var now = DateTime.UtcNow; 
      var tokenDescriptor = new SecurityTokenDescriptor 
      { 
       Subject = new ClaimsIdentity(new[] 
       { 
       new Claim(ClaimTypes.UserData, 
       "IsValid", ClaimValueTypes.String, "(local)") 
       }), 
       TokenIssuerName = "self", 
       AppliesToAddress = "https://www.mywebsite.com", 
       Lifetime = new Lifetime(now, now.AddMinutes(60)), 
       SigningCredentials = new SigningCredentials(new InMemorySymmetricSecurityKey(securityKey), 
        "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256", 
        "http://www.w3.org/2001/04/xmlenc#sha256"), 
      }; 

      var token = tokenHandler.CreateToken(tokenDescriptor); 
      var tokenString = tokenHandler.WriteToken(token); 

      return tokenString; 
     } 
    } 
</script> 

continuo a ricevere il seguente errore alla linea 113 (var = token di tokenHandler.CreateToken (tokenDescriptor);):

argomento 1: non può convertire da 'System.IdentityModel.Tokens.SecurityTokenDescriptor' a 'Microsoft.IdentityModel.Tokens.SecurityTokenDescriptor'

ma ho visto molti esempi in linea fare le cose esattamente come le ho fatto. Ho anche imbattuto in questo articolo (https://msdn.microsoft.com/en-us/library/jj157089(v=vs.110).aspx) che indica quanto segue:

In WIF 3.5, tutte le classi WIF erano contenute nel Microsoft.IdentityModel assemblaggio (microsoft.identitymicrosoft.identitymodel.dll). In WIF 4.5, le classi WIF sono state suddivise tra i seguenti assembly: mscorlib (mscorlib.dll), System.IdentityModel (System.IdentityModel.dll), System.IdentityModel.Services (System.IdentityModel.Services.dll) e System.ServiceModel (System.ServiceModel.dll).

Le classi WIF 3.5 erano tutte contenute in uno degli spazi dei nomi Microsoft.IdentityModel ; ad esempio, Microsoft.IdentityModel, Microsoft.IdentityModel.Tokens, Microsoft.IdentityModel.Web e così via. In WIF 4.5, le classi WIF sono ora distribuite tra gli spazi dei nomi System.IdentityModel, lo spazio dei nomi System.Security.Claims e lo spazio dei nomi System.ServiceModel.Security . Oltre a questa riorganizzazione, alcune classi WIF 3.5 sono state eliminate in WIF 4.5.

ho provato per il debug amore per passare ad utilizzare il Microsoft. * Namespace per il SecurityTokenDescriptor, in tanto sono un'altra serie di errori che dicono TokenIssuerName, AppliesToAddress, e la durata non sono valide le proprietà di questa categoria. Tuttavia, quando guardo i documenti online, sembra che tali proprietà esistano su Microsoft.IdentityModel.Tokens.SecurityTokenDescriptor. Eppure nel mio Visual Studio, quando faccio Go to Definition per quella classe, non ci sono, portandomi a credere che ci sia un qualche tipo di problema di configurazione nel mio Visual Studio. Nel mio gestore di pacchetti, mostra che ho installato Microsoft.IdentityModel.Tokens v5.0.0. Ho anche cambiato il progetto in .NET Framework 4.5.1 poiché la libreria JWT lo richiede. Oltre a ciò, non so dove altro guardare.

risposta

30

mi sono imbattuto in una situazione simile con la libreria OpenID Connect quando ho aggiornato, che in precedenza era nel pacchetto Microsoft.IdentityModel.Protocol.Extensions (che dipendeva 4.0.2 del pacchetto JWT), ma ora è Microsoft.IdentityModel.Protocols.OpenIdConnect che dipende 2.0.0 di Microsoft.IdentityModel.Protocols (che dipende dalla 5.0.0 del pacchetto JWT).

Rimuovere uno dei pacchetti Microsoft.IdentityModel* e System.IdentityModel* e installare solo il pacchetto più recente (5.0.0) System.IdentityModel.Tokens.Jwt che dipende da Microsoft.IdentityModel.Tokens.

Si vorrà utilizzare le istruzioni per questi spazi dei nomi:

  • Microsoft.IdentityModel.Tokens (ma non System.IdentityModel.Tokens)
  • System.IdentityModel.Tokens.Jwt
  • System.Security .Claims

Microsoft ha semplificato alcuni parametri per essere più simile a quello che ci si aspetterebbe dalle librerie JWT di altre piattaforme, quindi le proprietà SecurityTokenDescriptor sono tutte ittle diversa:

var tokenDescriptor = new SecurityTokenDescriptor 
{ 
    Subject = new ClaimsIdentity(new[] 
    { 
     new Claim(ClaimTypes.UserData, 
     "IsValid", ClaimValueTypes.String, "(local)") 
    }), 
    Issuer = "self", 
    Audience = "https://www.mywebsite.com", 
    Expires = now.AddMinutes(60), 
    SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(securityKey), SecurityAlgorithms.HmacSha256), 
}; 

Nota che SecurityAlgorithms.HmacSha256 è una stringa costante "HS256", proprio come usereste nella maggior parte delle altre biblioteche. Utilizzando il codice precedente più l'esempio nella tua domanda, dovresti essere in grado di generare un JWT valido.

+0

Alla fine sono riuscito a provare questo e ha funzionato magnificamente. Grazie molto! – Rocket04

Problemi correlati