2016-08-25 2 views
1

Ich habe JwtToken wie folgt erstellt:JwtToken - Claim Name JwtTokenTypes.Subject aufgelöst zu ClaimTypes.NameIdentifier, warum ist das und wie zu verhindern?

 X509Certificate2 cert = certificateStore.Certificate; 

     var now = DateTime.UtcNow; 
     var tokenHandler = new JwtSecurityTokenHandler(); 
     var tokenDescriptor = new SecurityTokenDescriptor() 
     { 
      Subject = new ClaimsIdentity(new[] 
      { 
        new Claim(JwtClaimTypes.Subject, upn), 
        new Claim(REQUEST_TYPE_NAME, requestType), 
        new Claim(DOMAIN_NAME, domain), 
       }), 
      Lifetime = new Lifetime(now, now.AddMinutes(60)), 
      SigningCredentials = new X509SigningCredentials(cert), 
      TokenIssuerName = ISSUER 
     }; 

     SecurityToken token = tokenHandler.CreateToken(tokenDescriptor); 

Das ist richtig. Token wird erstellt und seine erste Behauptung wird "sub" genannt, was Inhalt von JwtTokenTypes.Subject ist. Ich habe es durch jwt web überprüft.

Problem ist, dass ich diese Methode für die Lösung Ansprüche haben:

 if (string.IsNullOrWhiteSpace(token)) throw new MissingTokenException("Token should not be null."); 

     var tokenHandler = new JwtSecurityTokenHandler(); 
     var securityToken = new X509SecurityToken(new X509Certificate2(new X509RawDataKeyIdentifierClause(certificateStore.Certificate).GetX509RawData())); 
     var validationParameters = new TokenValidationParameters() 
     { 
      IssuerSigningToken = securityToken, 
      ValidateAudience = false, 
      ValidateActor = false, 
      ValidIssuer = ISSUER 
     }; 

     SecurityToken securedToken = new JwtSecurityToken(); 
     ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(token, validationParameters, out securedToken); 

     Claim claim = claimsPrincipal.FindFirst(m => string.Equals(m.Type, REQUEST_TYPE_NAME, StringComparison.OrdinalIgnoreCase)); 
     if (claim != null && !string.Equals(claim.Value, requestType, StringComparison.OrdinalIgnoreCase)) 
     { 
      throw new MismatchedTokenException("Token is not of the proper type."); 
     } 

     upn = claimsPrincipal.Claims.FirstOrDefault(m => m.Type.Equals(JwtClaimTypes.Subject) || m.Type.Equals(ClaimTypes.NameIdentifier))?.Value; 

     domain = claimsPrincipal.Claims.FirstOrDefault(m => m.Type.Equals(DOMAIN_NAME))?.Value; 

Am Ende des Verfahrens Sie überprüfe ich Anspruch Namen für JwtClaimTypes.Subject sehen kann, was es sein sollte, und für ClaimTypes.NameIdentifiew , was es eigentlich ist.

Haben Sie eine Idee, warum diese Transformationen auftreten oder wie Sie sie verhindern können?

Antwort

3

Sie müssen hinzufügen, bevor:

JwtSecurityTokenHandler.InboundClaimTypeMap.Clear(); 

, die die Zuordnung von Forderungen für jwt löscht.

Die Zuordnung erfolgt, um die Ansprüche der JWT an die .net-Ansprüche anzupassen. Wenn Sie die Zuordnung vermeiden, müssen Sie die Anspruchstypen für Name und Rolle festlegen, wenn Sie diese aus der Identität (IPrincipal.IsInRole oder Identity.Name) verwenden möchten.

Sie können dies tun, wenn die ClaimsIdentity erstellen:

Subject = new ClaimsIdentity(new[] 
    { 
      new Claim(JwtClaimTypes.Subject, upn), 
      new Claim(REQUEST_TYPE_NAME, requestType), 
      new Claim(DOMAIN_NAME, domain), 
     }, "<auth type>", "name", "role"), 

Sie die authType so etwas wie Cookie ändern müssen, und der Name und die Rolle Anspruch Namen höchstwahrscheinlich auch, dass sein würde.

Der andere Weg ist es auf dem Token-Validierung Parameter einzustellen:

var validationParameters = new TokenValidationParameters() 
    { 
     IssuerSigningToken = securityToken, 
     ValidateAudience = false, 
     ValidateActor = false, 
     ValidIssuer = ISSUER, 
     NameClaimType = "name", 
     RoleClaimType = "role" 
    }; 
Verwandte Themen