JWT: Как получить список значений из определенного ключа в заявках. C # Asp.Net Ядро

#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;