我將自定義聲明(例如用戶的真實姓名)存儲在ASP.NET身份Cookie中,以避免對每個請求進行不必要的數據庫查詢。至少這是我認爲這個代碼是這樣做的:身份Cookie在一段時間後失去定製聲明信息
var identity = await user.GenerateUserIdentityAsync(UserManager);
identity.AddClaim(new Claim(ClaimTypes.GivenName, user.FirstName)));
// etc.
AuthenticationManager.SignIn(new AuthenticationProperties {IsPersistent=true}, identity);
這工作得很好,我可以檢索與這些說法:
private static string GetClaim(string claimType)
{
var identity = (ClaimsPrincipal) Thread.CurrentPrincipal;
var claim = identity.Claims.SingleOrDefault(o => o.Type == claimType);
return claim == null ? null : claim.Value;
}
的identity.Claims
屬性包含下面的權利要求,符合市場預期:
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier: ced2d16c-cb6c-4af0-ad5a-09df14dc8207
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name: [email protected]
http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider: ASP.NET Identity
AspNet.Identity.SecurityStamp: 284c648c-9cc7-4321-b0ce-8a347cd5bcbf
http://schemas.microsoft.com/ws/2008/06/identity/claims/role: Admin
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname: My Name
麻煩的是,經過一段時間(通常幾個小時)後,我的自定義聲明似乎消失了 - 在此示例中,givenname
不再存在於枚舉中離子。用戶仍然通過身份驗證,所有默認聲明仍然存在。
這是怎麼回事,我該如何解決這個問題?我能想到的唯一事情就是cookie過期並在幕後重新發布,但我不知道爲什麼(或如果)會發生。
Hi @James。我能問個問題嗎。你說你這樣做是爲了「避免每次請求中的不必要的數據庫查詢」。這使我認爲Identity必須在每個請求上訪問數據庫。真的嗎?我做了一個非常簡單的測試,它似乎沒有訪問數據庫(基於沒有'DbContext.Database.Log'的輸出),但也許它被緩存了。很高興知道每個HTTP請求數據庫訪問將是一個壞消息。 –
@JonSmith如果我沒有緩存用戶的真實姓名(即在auth cookie中),每當我想知道他們的名字是什麼時,我都需要查詢Customers表。 – James
嗨@詹姆斯。好的,我現在明白了。我有幾乎相同的問題,但通過將它作爲聲明添加到數據庫中,它自動出現在cookie中。我假設cookie必須攜帶所有用戶的信息,這就是它如何設置IPrincipal而不需要查找。 –