Я рад, что кто-то, возможно, сталкивался с этим раньше .
Короче: значение словаря 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