Извлечь значения из HttpContext.User.Claims - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь извлечь адрес электронной почты из HttpContext.User.Claims, и я хотел бы попросить помощи, чтобы придумать лучший способ кодировать это (возможно, используя LINQ?)

То, как я это делаю сейчас, кажется очень смешным.

var userClaimsList = HttpContext.User.Claims.ToList();

// List is of varying length but email is always 3rd from the bottom.
int emailPosition = userClaimsList.Count()-3; 
string searchString = "preferred_username: "; 

// dirtyEmail = "preferred_username: xyz@emailcom"
string dirtyEmail = userClaimsList[emailPosition].ToString();
string cleanEmail = dirtyEmail.Replace(searchString, "").ToLower().Trim();

Я попробовал рекомендованные решения LINQ в другом сообщении , но получил ошибку Operator == cannot be applied to operands of type 'Claim' and 'string'.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Claim объекты - это нечто большее, чем просто строка, и то, что вы видите в userClaimsList, представляет собой список этих объектов претензий.

Претензии в основном являются парами типа претензии и значения претензии , и когда вы ищете определенную информацию о пользователе, вы должны использовать тип претензии для идентификации свойства пользователя. Вы ищете.

То, что вы делаете в своем коде, предполагает, что иск, который вы ищете, является третьим по счету, что само по себе уже является опасным допущением, поскольку вы не можете быть уверены, что это будет всегда . : заявки, как правило, считаются неупорядоченными, и вы должны искать их по типу. И как только вы получаете тип, вы затем .ToString() it, что существенно уменьшает всю информацию, имеющуюся у типа Claim, до одной строки формата claimType: claimValue. Вы можете использовать это, но это действительно неэффективно, когда сам объект является гораздо лучшим способом доступа к значению претензии.

Поскольку вы ищете префикс "preferred_username: ", я предполагаю, что preferred_username - это тип заявки , который вы ищете. В этом случае вы можете посмотреть это утверждение так:

var claim = HttpContext.User.Claims.First(c => c.Type == "preferred_username");
var emailAddress = claim.Value;

Использование First вызовет исключение, если иск с таким типом не был найден. Если вы этого не хотите, вы можете использовать FirstOrDefault, а затем проверить, является ли claim null.

Существует также несколько вспомогательных расширений, которые позволяют напрямую извлекать претензии. В этом случае вы можете использовать FindFirstValue для пользователя, чтобы получить сумму претензии напрямую:

var emailAddress = HttpContext.User.FindFirstValue("preferred_username");

В случае, если претензия с таким типом не была найдена, FindFirstValue вернет null, поэтому emailAddress может быть null в этом случае.

0 голосов
/ 01 мая 2018

То, что вы делаете, предполагает не только то, что вы не можете обеспечить, но и намного сложнее, чем необходимо:

// note: HttpContext.User == User
var cleanEmail = User.FindFirst(ClaimTypes.Email)?.Value;

Если данные не относятся к типу заявки email, проверьте соответствующий тип и используйте его вместо этого. В вашем случае кажется, что это должно быть preferred_username:

var cleanEmail = User.FindFirst("preferred_username")?.Value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...