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”.