Некоторые мысли ...
Ваши 4 и 5 дорожек; обычно вы не спрашиваете поставщика токена, действителен ли он. Что вы делаете, это проверяете, скорее всего, с помощью подписи, какие параметры можно (необязательно) загрузить у провайдера.
Обратите внимание на тонкую разницу: сам провайдер не проверяет это.
Далее:
ClockSkew = TimeSpan.Zero
, это очень мало. Я бы, по крайней мере, ослабил это.
И хотя бы; наличие 404
означает, что ресурс не найден. Это не 401
или 403
. Это предполагает, что авторизация прошла успешно, но запрошенный ресурс не найден.
Типичная реализация для проверки подписи:
примечание это не решит ваши 404.
options.TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKeyResolver = (s, securityToken, identifier, parameters) =>
{
// get from provider
// todo: cache this
var json = new WebClient().DownloadString(
issuer + "/.well-known/jwks.json"); //typical endpoint
// serialize the result
var keys = JsonConvert.DeserializeObject<JsonWebKeySet>(json).Keys;
// cast the result to be the type expected by IssuerSigningKeyResolver
return (IEnumerable<SecurityKey>) keys;
}
//...