【发布时间】:2018-10-11 18:09:05
【问题描述】:
我正在尝试从 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 解决方案 in another post,但收到错误 Operator == cannot be applied to operands of type 'Claim' and 'string'。
【问题讨论】:
-
“但电子邮件总是倒数第三”——这是一个非常危险的假设。声明由声明类型标识,因此如果您正在查找电子邮件地址,则该声明很可能具有您应该查询的特定声明类型。所以用它来获得价值,例如使用
HttpContext.User.FindFirstValue(emailClaimType) -
另请注意,声明列表是
Claim对象的列表,而不是字符串。因此,您执行ToString()会将它们转换为可能包含较少信息的字符串。您应该直接使用实际的声明对象。 -
是的,我知道。我讨厌做出这样的假设,这也是我发布这个问题的部分原因。
标签: c# linq asp.net-core