【问题标题】:Membership.ValidateUser return: nullMembership.ValidateUser 返回:null
【发布时间】:2011-12-22 22:08:20
【问题描述】:

我使用 AspNetSqlMembershipProvider 创建了一个登录入口

<membership defaultProvider="AspNetSqlMembershipProvider">
 <providers>
    <remove name="AspNetSqlMembershipProvider"/>
    <add name="AspNetSqlMembershipProvider" requiresQuestionAndAnswer="false" enablePasswordRetrieval="false" enablePasswordReset="true" connectionStringName="MembershipDB" minRequiredPasswordLength="8" minRequiredNonalphanumericCharacters="1" applicationName="php" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>

但是我无法使用我创建的用户名和密码登录,我进入代码并发现 Membership.ValidateUser return: null

代码如下:

   protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
   {
            bool UserAuthenticated = false;
            MembershipProvider AuthenticationProviderUsed = null;
            RoleProvider roleProvider = Roles.Providers["SqlRoleProvider"];
            // Try authenticating the user against each membership provider
            foreach (MembershipProvider membershipProvider in Membership.Providers)
            {
                try
                {
                    if (membershipProvider.ValidateUser(loginInitial.UserName, loginInitial.Password)) // here got null.
                    {

我检查了数据库。用户名和密码都在那里。 感谢您的帮助。

更新:返回 false。

然后MembershipUser user = Membership.GetUser(loginInitial.UserName);user 返回null

再次更新:更多代码,

    protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
    {
            bool UserAuthenticated = false;
            MembershipProvider AuthenticationProviderUsed = null;
            RoleProvider roleProvider = Roles.Providers["SqlRoleProvider"];
            // Try authenticating the user against each membership provider
            foreach (MembershipProvider membershipProvider in Membership.Providers)
            {
                try
                {
                    if (membershipProvider.ValidateUser(loginInitial.UserName, loginInitial.Password))
                    {
                        if (base.ConfigSettings.OperatingMode == ConfigurationSettingValues.OperatingModes.NoAccess)
                        {
                            if (!roleProvider.IsUserInRole(loginInitial.UserName, ConfigurationManager.AppSettings["AdminRole"]))
                            {
                                FormsAuthentication.SignOut();
                                return;
                            }
                        }

                        MembershipUser usrInfo = Membership.GetUser(loginInitial.UserName);
                        if (membershipProvider.Name == "ActiveDirectoryMembershipProvider")
                        {
                            System.Web.Security.FormsAuthentication.SetAuthCookie(loginInitial.UserName, loginInitial.RememberMeSet);
                            UserAuthenticated = true;
                            AuthenticationProviderUsed = membershipProvider;
                            break;
                       }
                        else
                        {
                            
                            Int16 daysSincePwdChange = Convert.ToInt16(DateTime.Now.Subtract(usrInfo.LastPasswordChangedDate).TotalDays);

                            System.Web.Security.FormsAuthentication.SetAuthCookie(loginInitial.UserName, loginInitial.RememberMeSet);

                            if (daysSincePwdChange > SecurityUtils.DefaultPasswordExpiryInDays || usrInfo.Comment == "ChangePassword")
                            {
                                 e.Authenticated = false;
                                Response.Redirect("~/admin/ChangePassword.aspx?UserName=" + Server.UrlEncode(loginInitial.UserName));
                             }
                            else
                            {

                                System.Web.Security.FormsAuthentication.SetAuthCookie(loginInitial.UserName, loginInitial.RememberMeSet);
                                UserAuthenticated = true;
                                AuthenticationProviderUsed = membershipProvider;
                                break;
                            }
                        }
              
                   }
                    else
                    {
                        // See if the user is locked out
                        MembershipUser user = Membership.GetUser(loginInitial.UserName);
                        if (user != null && user.IsLockedOut)
                        {
                            ErrorMessage.Text = "Your account is currently locked out.  Please contact the system administrator.";
                        }
                        else
                        {
                            ErrorMessage.Text = "Invalid user name and/or password";
                            //Response.Write("Invalid User Name or Password");
                        }
                    }
                }

                catch (Exception ex)
                {
                       LoggingLibrary.LogException(this.Logger, Context, ex, ex);

                }
            } 

错误消息是:“无效的用户名和/或密码”

【问题讨论】:

  • MembershipProvider.ValidateUser 返回一个布尔值。您可能的意思是它返回 false,而不是 null。
  • Membership.ValidateUser 只能返回真或假。
  • 即使您没有显示完整的代码,我假设您仅在 ValidateUser 返回 true 时调用 Membership.GetUser。所以我不明白你更新的问题,你说 ValidateUser 返回 false 但 Membership.GetUser 为空(你不应该正常到达这一点)。

标签: c# asp.net


【解决方案1】:

您应该做的第一件事是检查用户是否存在于数据库中。 您可能正在使用两个不同的数据库,一个在本地,一个用于生产。 能否显示 AspNetSqlMembershipProvider 的连接字符串?

* 编辑 * 我不是连接字符串方面的专家,但在我看来,您正在针对 sql compact db 运行。我将使用 vs 或 sql 管理器中的服务器资源管理器连接到数据库,并检查 aspnet_Users 表并验证您的用户是否存在。

您是在本地测试还是在生产机器上进行测试?如果在生产中,它是否在本地工作?

【讨论】:

  • “aspnet_Membership”表中有一个“IsApproved”字段。一旦它是真的,那么一切都很好。默认为假。
猜你喜欢
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
相关资源
最近更新 更多