#c# #asp.net #asp.net-core #jwt #claims
#c# #asp.net #asp.net-ядро #jwt #претензии
Вопрос:
Я использую этот фрагмент кода для чтения одного значения из утверждений в JWT.
return httpContext.User.Claims.Single(x => x.Type == "id").Value;
чтобы получить значение этого утверждения:
"id": "b6dddcaa-dba6-49cf-ae2d-7e3a5d060553"
Однако я хочу прочитать ключ, который имеет несколько значений.
Но с тем же кодом:
return httpContext.User.Claims.Single(x => x.Type == "groups").Value;
для этого утверждения:
"groups": [
"123",
"234"
],
Я логически получаю следующее сообщение об ошибке:
System.InvalidOperationException: "Sequence contains more than one matching element"
Я не могу найти соответствующий метод. Кто-нибудь может мне помочь?
Ответ №1:
Это из Single()
-за того, Where()
что вместо Single()
return httpContext.User.Claims
.Where(x => x.Type == "groups") //Filter based on condition
.Select(y => y.Value); // get only Value
Single()
: Возвращает один конкретный элемент последовательности. Выдает ошибку, если найдено несколько элементов, удовлетворяющих условию
Ответ №2:
Ссылка ClaimsPrincipal.FindAll(Predicate<Claim>)
Извлекает все утверждения, которым соответствует указанный предикат.
IEnumerable<Claim> claims = httpContext.User.FindAll(x => x.Type == "groups");
IEnumerable<string> values = claims.Select(c => c.Value);
return values;