我使用的是ASP.NET Membership。如果我所关心的是我是否有非null的Membership.GetUser(),是否有理由使用Request.IsAuthenticated?
在开发期间,我无意中创建了Request.IsAuthenticated为true的情况,但Membership.GetUser()为null,因此我将通过[Authorize]过滤器测试(全局应用,[AllowAnonymous]专门应用于需要),但稍后失败。虽然这种情况可能不会在生产中出现,但我仍然想要考虑它。
鉴于此,编写一个自定义过滤器(比如AuthorizeMembership或其他类似的过滤器,检查Membership.GetUser()而不是Request.IsAuthenticated)是否合适?有什么需要注意的吗?
如果是这样,使用该过滤器是否可以使用我通常需要处理请求的用户属性来填充全局UserInfo对象?我根本不使用会员资格,但在单独的应用程序数据库中独立管理我的用户属性。
答案 0 :(得分:0)
主要的不同是速度。
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);
}
}
}