He estado usando la biblioteca JWT para decodificar un Json Web Token y me gustaría cambiar a la implementación oficial de JWT de Microsoft, System.IdentityModel.Tokens.Jwt .
La documentación es muy escasa, por lo que me cuesta trabajo averiguar cómo lograr lo que he estado haciendo con la biblioteca JWT. Con la biblioteca JWT, existe un método Decode que toma el JWT codificado en base64 y lo convierte en JSON, que luego puede deserializarse. Me gustaría hacer algo similar usando System.IdentityModel.Tokens.Jwt, pero después de una buena cantidad de excavación, no puedo averiguar cómo.
Por lo que vale, estoy leyendo el token JWT de una cookie, para usar con el marco de identidad de Google.
Cualquier ayuda sería apreciada.
Respuestas:
Dentro del paquete hay una clase llamada
JwtSecurityTokenHandler
que deriva deSystem.IdentityModel.Tokens.SecurityTokenHandler
. En WIF, esta es la clase principal para deserializar y serializar tokens de seguridad.La clase tiene un
ReadToken(String)
método que tomará su cadena JWT codificada en base64 y devuelve unSecurityToken
que representa el JWT.El
SecurityTokenHandler
también tiene unValidateToken(SecurityToken)
método que lleva suSecurityToken
y crea unaReadOnlyCollection<ClaimsIdentity>
. Por lo general, para JWT, esto contendrá un soloClaimsIdentity
objeto que tiene un conjunto de reclamos que representan las propiedades del JWT original.JwtSecurityTokenHandler
define algunas sobrecargas adicionalesValidateToken
, en particular, tiene unaClaimsPrincipal ValidateToken(JwtSecurityToken, TokenValidationParameters)
sobrecarga. ElTokenValidationParameters
argumento le permite especificar el certificado de firma del token (como una lista deX509SecurityTokens
). También tiene una sobrecarga que toma el JWT comostring
unSecurityToken
.El código para hacer esto es bastante complicado, pero se puede encontrar en el código (
TokenValidationHandler
clase) Global.asax.cx en la muestra del desarrollador llamada "ADAL - Aplicación nativa al servicio REST - Autenticación con ACS a través del cuadro de diálogo del navegador", ubicado enhttp://code.msdn.microsoft.com/AAL-Native-App-to-REST-de57f2cc
Alternativamente, la
JwtSecurityToken
clase tiene métodos adicionales que no están en laSecurityToken
clase base , como unaClaims
propiedad que obtiene las notificaciones contenidas sin pasar por laClaimsIdentity
colección. También tiene unaPayload
propiedad que devuelve unJwtPayload
objeto que le permite obtener el JSON sin procesar del token. Depende de su escenario cuál es el enfoque más adecuado.La documentación general (es decir, no específica de JWT) para la
SecurityTokenHandler
clase está enhttp://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.securitytokenhandler.aspx
Dependiendo de su aplicación, puede configurar el controlador JWT en la canalización WIF exactamente como cualquier otro controlador.
Hay 3 muestras en uso en diferentes tipos de aplicación en
http://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=SearchText&f%5B0%5D.Value=aal&f%5B1%5D.Type=User&f%5B1%5D.Value=Azure% 20AD% 20Desarrollador% 20Experiencia% 20Team &f% 5B1% 5D.Text = Azure% 20AD% 20Desarrollador% 20Experiencia% 20Team
Probablemente, uno se adaptará a sus necesidades o al menos se adaptará a ellas.
fuente
Me pregunto por qué usar algunas bibliotecas para la decodificación y verificación de tokens JWT.
El token JWT codificado se puede crear usando el siguiente pseudocódigo
Es muy fácil hacerlo sin una biblioteca específica. Usando el siguiente código:
La decodificación del token es la versión inversa del código anterior. Para verificar la firma, necesitará la misma y comparar la parte de la firma con la firma calculada.
ACTUALIZACIÓN: Para aquellos que tienen dificultades para realizar la codificación / decodificación segura de URL en base64, consulte otra pregunta SO , y también wiki y RFC
fuente