У меня есть проект Web API, через который я регистрируюсь и авторизуюсь. При авторизации, где я должен получить токен, появляется ошибка:
An unhandled exception has occurred while executing the request. System.TypeInitializationException: The type initializer for System.IdentityModel.Tokens.Jwt.JsonExtensions' threw an exception. System.TypeLoadException: Could not load type 'Microsoft.IdentityModel.Json.JsonConvert' from assembly 'Microsoft.IdentityModel.Tokens, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
Код генерации токена:
using ASFT.Auth.Interfaces;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Security.Cryptography;
namespace ASFT.Auth.Services
{
public class TokenService : ITokenService
{
public string GenerateAccessToken(IEnumerable<Claim> claims)
{
var signinCredentials = new SigningCredentials(AuthOptions.Key, SecurityAlgorithms.HmacSha256);
var tokenOptions = new JwtSecurityToken(
issuer: AuthOptions.Issuer,
audience: AuthOptions.Audience,
claims: claims,
expires: DateTime.Now.AddHours(48),
signingCredentials: signinCredentials);
return new JwtSecurityTokenHandler().WriteToken(tokenOptions);
}
}
}
В этой строке ошибка - return new JwtSecurityTokenHandler().WriteToken(tokenOptions);
Подключенные пакеты:
<PackageReference Include = "Microsoft.AspNetCore.Authentication.JwtBearer" Version = "7.0.11" />
<PackageReference Include = "Microsoft.AspNetCore.OpenApi" Version = "7.0.11" />
<PackageReference Include = "Microsoft.IdentityModel.Tokens" Version = "7.0.0" />
<PackageReference Include = "Swashbuckle.AspNetCore" Version = "6.5.0" />
<PackageReference Include = "Microsoft.EntityFrameworkCore" Version = "7.0.11" />
<PackageReference Include = "Microsoft.EntityFrameworkCore.SqlServer" Version = "7.0.11" />
<PackageReference Include = "Microsoft.EntityFrameworkCore.Tools" Version = "7.0.11">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets></PackageReference>
Ожидаемый статус 200 с токеном и токеном обновления в теле ответа.





Прежде всего, вам, вероятно, следует включить:
<PackageReference Include = "System.IdentityModel.Tokens.Jwt" Version = "7.0.0" />
в вашем .csproj. Убедитесь, что значение version правильное: оно должно соответствовать требованиям других ваших пакетов NuGet.
Если это не сработает, это может быть проблемой, вызванной попыткой среды выполнения удалить сборки, которые, по ее мнению, уже имеются в среде выполнения и дублируются в вашем проекте.
Попробуйте добавить это в свой .csproj файл
<PropertyGroup>
<_FunctionsSkipCleanOutput>true</_FunctionsSkipCleanOutput>
</PropertyGroup>
Более подробное описание и объяснение проблемы вы можете найти здесь.
Я добавил эту строку, но ошибка осталась та же ((
Проверьте мое редактирование ответа. После добавления пакета выполните очистку и перестройку.
Спасибо!! Я подключил System.IdentityModel.Tokens.Jwt версии 7.0.0 (последняя) :)
В моем случае я не нашел пакет System.IdentityModel.Tokens.Jwt в версии 7.0.11. Похоже 7.0.0 последняя.
Я исправил это, понизив версию System.IdentityModel.Token.Jwt с 7.0.0 до 6.32.3. Кажется, 7.0.0 несовместим с другими пакетами IdentityModel.
Это основной выпуск, и в нем есть несколько серьезных изменений. Вероятно, вам потребуется обновить свой код, а если вы используете другие пакеты, зависящие от IdentityModel, вам придется подождать, пока они также будут поддерживать версию 7.x.
@EirikH в моем случае это Microsoft.AspNetCore.Authentication.OpenIdConnect 7.0.11 nuget.org/packages/… который «загружает» старую версию 6.x Microsoft.IdentityModel.Protocols.OpenIdConnect, которая, в свою очередь, похоже, использует (ВНУТРЕННИЙ!) Класс JsonObjectAttribute, которого больше не существует. в System.IdentityModel.Tokens 7.0.11. Добавление <PackageReference Include = "Microsoft.IdentityModel.Protocols.OpenIdConnect" Version = "7.0.0" /> решило проблему для меня
@springy76 ты спасатель. Вчера/сегодня я ломал голову несколько часов (и вчера наткнулся на этот пост), но эта явная ссылка на пакет решила проблему. Честно говоря, вам следует опубликовать это как ответ на сам вопрос — это лучшее решение, чем переход на более раннюю версию пакета, IMO.
Согласен с Куртисом Юнгерсеном @springy76, ваш комментарий заслуживает большей видимости.
Это исправлено для меня, добавив этот пакет:
<PackageReference Include = "Microsoft.IdentityModel.Protocols.OpenIdConnect" Version = "7.0.1" />
Я использовал комментарий @springy76.
Похоже на ошибку пакета Json