Saltar al contenido

Excepción de token JWT en ASP.Net (Error de validación de por vida. Falta un tiempo de vencimiento en el token).

Solución:

@aha, parece que resolvió su problema acortando su fecha de vencimiento a solo un año en el futuro. Lo cual funciona, pero si desea comprender la razón arquitectónica subyacente por la que fallaba antes (y, como tal, realizar los cambios arquitectónicos apropiados en su propio código), puede leer esta publicación de SO aquí: https://stackoverflow.com/a/ 46654832/1222775.

La conclusión es que la fecha de vencimiento de los JWT validados con el software intermedio propio de Microsoft tiene un límite superior de 2147483647 (que también resulta ser Int32.MaxValue), y eso se traduce en: Tue, 19 Jan 2038 03:14:07 GMT

En su pregunta SO, el resultado de depuración que publicó que muestra el valor de reclamo “exp” que utilizó, fue un valor de 33051661101 que se traduce en: Wednesday, May 14, 3017 8:58:21 AM que supera el límite superior de Microsoft para el valor de exp en casi 80 años :).

Espero que Microsoft resuelva este problema pronto, pero mientras tanto, para cualquier persona que experimente un problema similar, intente no emitir tokens de larga duración, o al menos, no lo haga pasar el martes 19 de enero de 2038 a las 03:14 : 07 GMT :).

Siguiendo la sugerencia aquí, solucioné el problema cambiando de usar

System.IdentityModel.Tokens.Jwt.TokenHandler.CreateToken(SecurityTokenDescriptor)

para

new System.IdentityModel.Tokens.Jwt.JwtSecurityToken(JwtHeader, JwtPayload).

Y definió la carga útil de la siguiente manera:

DateTime centuryBegin = new DateTime(1970, 1, 1);
var exp = new TimeSpan(DateTime.Now.AddYears(1).Ticks - centuryBegin.Ticks).TotalSeconds;
var now = new TimeSpan(DateTime.Now.Ticks - centuryBegin.Ticks).TotalSeconds;
var payload = new System.IdentityModel.Tokens.Jwt.JwtPayload
{
    {"iss", issuer},
    {"aud", audience},
    {"iat", (long)now},
    {"exp", (long)exp}
};

Entonces, terminé sin usar la clase SecurityTokenDescriptor porque espera que se asignen objetos DateTime Expirs y IssuedAt, o Lifetime propiedades (dependiendo de si se encuentra en el Microsoft.IdentityModel.Tokens o System.IdentityModel.Tokens espacio de nombres).

No tengo ninguna intención de utilizar SecurityTokenDescriptor; sin embargo, no pude encontrar una solución sobre cómo usar SecurityTokenDescriptor y aún así establecer los valores correctos en el campo “exp”.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *