簡體   English   中英

從HttpContext.User.Claims中提取值

[英]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 ,然后檢查是否claimnull

還有一些幫助程序擴展,允許您直接提取聲明。 在這種情況下,您可以在用戶上使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM