Авторизация токена носителя JWT не работает после обновления до .NET 8C#

Место общения программистов C#
Ответить
Anonymous
 Авторизация токена носителя JWT не работает после обновления до .NET 8

Сообщение Anonymous »

Я понимаю, что существует множество проблем, связанных с обновлением до .NET 8, и я сделал все возможное, чтобы выяснить, связана ли проблема, с которой я столкнулся, но ни одно из решений, которые я видел, не помогло мне, и я не заметил, чтобы кто-то еще сталкивался с такой же проблемой.
К сожалению, я довольно невежественен, когда дело касается JWT и аутентификации, но позвольте мне объяснить, что я наблюдаю.
Код, работающий с .NET 7, выглядит примерно следующим образом:

Код: Выделить всё

options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateIssuerSigningKey = true,
ValidateAudience = true,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};

options.Authority = KeyCloakOptions.Authority;
options.MetadataAddress = $"{options.Authority}/.well-known/openid-configuration";
options.RequireHttpsMetadata = false;
options.RefreshOnIssuerKeyNotFound = true;
options.Audience = KeycloakOptions.AudienceInvoice;
options.Events = new JwtBearerEvents
{
OnAuthenticationFailed = context =>
{
_logger.LogDebug("Authentication failed: " + context);
return Task.CompletedTask;
},
OnTokenValidated = context =>
{
_logger.LogDebug("JWT Bearer Token Validated.");
return Task.CompletedTask;
}
};
Если я использую этот код, я получу ошибку об эмитенте, например:

IDX10204: Unable для проверки эмитента. validationParameters.ValidIssuer имеет значение NULL или пробел И validationParameters.ValidIssuers имеет значение NULL или пусто.

Это можно решить, изменив TokenValidationParameters, включив в него эмитента. , через:

Код: Выделить всё

options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateIssuerSigningKey = true,
ValidateAudience = true,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero,
ValidIssuer = KeyCloakOptions.Authority
};
Я не понимаю, почему это теперь нужно в .NET 8, а не в .NET 7. Однако даже в этом случае после внесения вышеуказанного изменения я получу аналогичную ошибку относительно аудитория, что-то вроде:

IDX10208: невозможно проверить аудиторию. validationParameters.ValidAudience имеет значение null или пробел, а validationParameters.ValidAudiences имеет значение null.

И опять же, это можно преодолеть, изменив TokenValidationParameters, включив в него аудитория, через:

Код: Выделить всё

options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateIssuerSigningKey = true,
ValidateAudience = true,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero,
ValidIssuer = KeyCloakOptions.Authority,
ValidAudience = KeycloakOptions.AudienceInvoice
};
Это приведет к следующей ошибке, связанной с ключом подписи. И что касается этого, я не знаю, что мне нужно сделать, чтобы это заработало.
Однако мой главный вопрос заключается в том, почему мне теперь нужно включать такие вещи, как Эмитент, Аудитория и Ключи в TokenValidationParameters, тогда как раньше это работало нормально как часть параметров. Похоже, что некоторые параметры, такие как options.MetadataAddress, игнорируются в .NET 8, поэтому теперь мне нужно явно указать значения в TokenValidationParameters.
Или, возможно, более фундаментальный вопрос: нужно ли мне что-то добавить/изменить, чтобы тот же (или очень похожий код), который работал в .NET 7, работал и в .NET 8.
Спасибо за любую помощь,
Эрик

Подробнее здесь: https://stackoverflow.com/questions/783 ... e-to-net-8
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»