主要不同是速度。
的Request.IsAuthenticated
更快並且使用內部緩存標誌,比Membership.GetUser()
。
明白爲什麼一個比其他快我放在這裏的代碼。
public virtual bool IsAuthenticated
{
get
{
if (this.m_isAuthenticated == -1)
{
WindowsPrincipal principal = new WindowsPrincipal(this);
SecurityIdentifier sid = new SecurityIdentifier(IdentifierAuthority.NTAuthority, new int[] { 11 });
this.m_isAuthenticated = principal.IsInRole(sid) ? 1 : 0;
}
return (this.m_isAuthenticated == 1);
}
}
但GetUser()
有太多的電話,因爲實際上需要更多的信息,是給予。
public static MembershipUser GetUser()
{
return GetUser(GetCurrentUserName(), true);
}
private static string GetCurrentUserName()
{
if (HostingEnvironment.IsHosted)
{
HttpContext current = HttpContext.Current;
if (current != null)
{
return current.User.Identity.Name;
}
}
IPrincipal currentPrincipal = Thread.CurrentPrincipal;
if ((currentPrincipal != null) && (currentPrincipal.Identity != null))
{
return currentPrincipal.Identity.Name;
}
return string.Empty;
}
public static MembershipUser GetUser(string username, bool userIsOnline)
{
SecUtility.CheckParameter(ref username, true, false, true, 0, "username");
return Provider.GetUser(username, userIsOnline);
}
internal static void CheckParameter(ref string param, bool checkForNull, bool checkIfEmpty, bool checkForCommas, int maxSize, string paramName)
{
if (param == null)
{
if (checkForNull)
{
throw new ArgumentNullException(paramName);
}
}
else
{
param = param.Trim();
if (checkIfEmpty && (param.Length < 1))
{
throw new ArgumentException(SR.GetString("Parameter_can_not_be_empty", new object[] { paramName }), paramName);
}
if ((maxSize > 0) && (param.Length > maxSize))
{
throw new ArgumentException(SR.GetString("Parameter_too_long", new object[] { paramName, maxSize.ToString(CultureInfo.InvariantCulture) }), paramName);
}
if (checkForCommas && param.Contains(","))
{
throw new ArgumentException(SR.GetString("Parameter_can_not_contain_comma", new object[] { paramName }), paramName);
}
}
}
您可能需要詳細說明這些「情況」。代碼示例也會有所幫助。因爲它似乎是你的代碼來創建這樣的無用的情況,而不是避免它們,你試圖找出一個更糟的解決方法。 –
@Wiktor,這些情況不會在我的代碼中創建。如果用戶已登錄,然後從成員資格中外部刪除,則Request.IsAuthenticated將爲true,但GetUser()將爲空。是否需要代碼才能回答第一個問題?不知道我應該提供那裏,因爲我問我應該寫什麼(如果我想授權爲GetUser()爲中心而不是IsAuthenticated爲中心),而不是我寫的。 – osoviejo
從你的寫作我明白,只有噹噹前用戶從數據庫中刪除,然後在同一個請求中完成對'IsAuthenticated'的調用時纔會出現問題。如果是這樣,爲什麼用戶在從數據庫中刪除後沒有立即註銷? –