Проблемы с получением заявок на объекты с использованием System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler в C#.C#

Место общения программистов C#
Anonymous
Проблемы с получением заявок на объекты с использованием System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler в C#.

Сообщение Anonymous »

Перед прочтением может быть важно обратить внимание: все это работало раньше при использовании System.IdentityModel.Tokens.Jwt версии 6.15.1. После перевода решения с .net 6.0 на 8.0 и обновления этого пакета оно перестало работать. В нашей промежуточной среде (.net 6.0) он по-прежнему работает, как и раньше, и я попробовал запустить его локально, и он все еще работает. Весь код кажется одинаковым, и я попробовал CTRL+C CTRL+V все файлы от нашего контроллера до функций. Я попытался понизить версию пакета jwt, но мне пока не удалось понизить версию всего проекта до .net 6.0, но это то, над чем я сейчас работаю.
Я рад, что кто-то, возможно, сталкивался с этим раньше .
Короче: значение словаря Claims устанавливается на тип объекта, а valueType тот же, тогда как раньше значение было установлено в представление json, а также valueType был "JSON"
Изображение

У меня есть приложение который имеет аутентификацию с использованием JWT.
Сначала я создаю токен с помощью SecurityTokenDescriptor, устанавливая различные поля, затем внутри я также устанавливаю для Claims значение Dictionary.
// ...

var securityTokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
// ...
}),
Claims = GetClaims(x), //this function returns a Dictionary
// ...
};
_expires = securityTokenDescriptor.Expires;

return jwtSecurityTokenHandler.WriteToken(
jwtSecurityTokenHandler.CreateToken(securityTokenDescriptor)
);


Затем у меня была функция, позволяющая заглянуть внутрь токенов и увидеть, что они содержат, возвращая ClaimsPrincipal:

public ClaimsPrincipal ReturnTokenClaimsPrincipal(string token)
{
var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(_jwtSettings.SigningKey));
var tokenHandler = new JwtSecurityTokenHandler();
return tokenHandler.ValidateToken(token, new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
ValidateIssuer = true,
ValidateAudience = true,
ValidIssuer = _jwtSettings.Issuer,
ValidAudience = _jwtSettings.Audience,
IssuerSigningKey = signingKey,
TokenDecryptionKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(_jwtSettings.EncryptionKey))
}, out _);
}

Однако, перебирая ClaimsPrincipal.Claims, пытаясь сопоставить их с другим объектом,
вот так:
Где словарь будет содержать (где класс A будет иметь ту же структуру, что и класс B).

if (claim.Type == "DictionaryKey")
X.Add(JsonConvert.DeserializeObject(claim.Value));


При отладке я обнаружил, что require.Value на самом деле не сам объект, а просто строка, содержащая что-то вроде «Namespace.ClassA».
После понижения версии System.IdentityModel.Tokens.Jwt до той же версии, которая использовалась при промежуточном этапе, но это не помогло (я думаю также попробовать сделать это и перезапустить компьютер/Visual Studio, чтобы посмотреть, проходит ли он или нет)
РЕДАКТИРОВАТЬ: ответ на вопрос GHDevOps таким образом, чтобы его можно было отформатировать
В первом фрагменте кода, где инициализируется SecurityTokenDescriptor, в этом точка:
Claims = GetClaims(x)
Функция (упрощенно) выглядит следующим образом:
public Dictionary GetClaims(){
List somePermissions =
[
new Permission
{
Name = "SomeName",
Level = "SomeLevel",
ExtraInfo = ["A","B","C"]
}
]

var result = new Dictionary
{
{
"DictionaryKey",
somePermissions
}
}
return result;
}


Подробнее здесь: https://stackoverflow.com/questions/787 ... tsecurityt

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