2011-08-22 149 views
3

我最近开始使用ASP.NET Forms Authentication和Membership。Membership.GetUser()。ProviderUserKey总是返回空

我在Visual Studio中创建了一个C#项目,它自动创建了诸如“/Account/Login.aspx”之类的页面。

然后,我跟着一个示例将aspnet_*表安装到我的SQL Server数据库,并且我已经能够使用<asp:CreateUserWizardStep>控件来创建用户。

话,我已经能够登录作为该用户,并在用户名登录时调用<asp:LoginName>

然而,当我把我的C#代码如下,在一个按钮单击事件处理程序出现时,我总是得到一个空引用异常:

string UserID = Membership.GetUser().ProviderUserKey.ToString(); 

不应该回到这个从我aspnet_Users表格内的UserID

如果<asp:LoginName>是显示一个用户名值,不应该我总是能够调用Membership.GetUser().ProviderUserKey

+1

_When_你打电话给这个吗?在登录代码本身中,用户会得到'null'。 –

+0

你肯定会得到'NullReferenceException',因为'Membership.GetUser()'返回的用户对象是'null'。所以你应该在询问'ProviderUserKey'之前检查它。 –

+0

@亨克Holterman我称之为按钮点击事件处理程序 – Curt

回答

5

首先检查是否有一个有效的身份验证的用户ID。从你的问题来看,这听起来像你有。但是一系列的检查总是一个好的做法。

我喜欢使用这两个方法(第二个调用第一个,但您也可以直接调用第一个,我建议调用第二个)执行各种检查并返回用户ID,如果有是用户未验证或未识别:

public static MembershipUser GetCurrentUser() 
    { 
     HttpContext httpContext = HttpContext.Current; 
     if (httpContext != null && httpContext.User != null && httpContext.User.Identity.IsAuthenticated) 
     { 
      return Membership.GetUser(); 
     } 

     return null; 
    } 

    /// <summary> 
    /// Safe check of authenticity. Better than Request.IsAuthenticated in that if there's a used-to-be-valid cookie which does not correspond to the current database, it will fail safe 
    /// </summary> 
    /// <returns></returns> 
    public static bool IsUserAuthenticated() 
    { 
     if (HttpContext.Current == null) 
      return false; 

     var request = HttpContext.Current.Request; 

     if (!request.IsAuthenticated) 
      return false; 

     var membershipUser = GetCurrentUser(); 

     if (membershipUser != null) 
      return true; 

     return false; 
    }