[英].NET Core Web API HttpContext.User.Claims and HttpContext.User.Identity are always null in Controllers
[英]Extract values from HttpContext.User.Claims
我正在嘗試從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'
。
Claim
對象不僅僅是一個簡單的字符串,而您在userClaimsList
是這些聲明對象的列表。
聲明主要是索賠類型和聲明值的對 ,當您查找有關用戶的某些信息時,您應該使用聲明類型來標識您要查找的用戶屬性。
您在代碼中所做的是假設您要求的聲明是倒數第三,這本身已經是一個危險的假設,因為您不能確定這種情況總是如此:聲明通常被認為是無序的,您應該按類型查找它們。 一旦你獲得了類型,你就可以使用.ToString()
它,它基本上將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
。
你所做的不僅是假設你無法保證的東西,而且還要比你需要的更難:
// note: HttpContext.User == User
var cleanEmail = User.FindFirst(ClaimTypes.Email)?.Value;
如果數據不在email
聲明類型中,請檢查相應的類型並使用該類型。 在您的情況下,它似乎應該是preferred_username
:
var cleanEmail = User.FindFirst("preferred_username")?.Value;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.