2012-11-07 144 views
1

我正在通过实施System.Web.Security.membershipprovider编写自定义会员供应商类。编写自定义会员供应商

我现在的问题是在访问我收到错误的类作为

错误代码:

String reference not set to an instance of a String. 
Parameter name: s 

堆栈跟踪:

at System.Text.Encoding.GetBytes(String s) 
    at ss.Provider.EncodePassword(String password) 
    at ss.Provider.CreateUser(String username, String password, String email, String passwordQuestion, String passwordAnswer, Boolean isApproved, Object providerUserKey, MembershipCreateStatus& status) 
    at System.Web.UI.WebControls.CreateUserWizard.AttemptCreateUser() 
    at System.Web.UI.WebControls.CreateUserWizard.OnNextButtonClick(WizardNavigationEventArgs e) 
    at System.Web.UI.WebControls.Wizard.OnBubbleEvent(Object source, EventArgs e) 
    at System.Web.UI.WebControls.CreateUserWizard.OnBubbleEvent(Object source, EventArgs e) 
    at System.Web.UI.WebControls.Wizard.WizardChildTable.OnBubbleEvent(Object source, EventArgs args) 
    at System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) 
    at System.Web.UI.WebControls.Button.OnCommand(CommandEventArgs e) 
    at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) 
    at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) 
    at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) 
    at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) 
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 

和我的班级为

创建用户:

public override MembershipUser GetUser(object userID,bool userIsOnline) 
     { 
      SqlConnection sqlConnection = new SqlConnection(connectionString); 
      SqlCommand sqlCommand = new SqlCommand("User_SelByUserID", sqlConnection); 

      sqlCommand.CommandType = CommandType.StoredProcedure; 
      sqlCommand.Parameters.Add("@userID", SqlDbType.UniqueIdentifier).Value = userID; 

      MembershipUser membershipUser = null; 
      SqlDataReader sqlDataReader = null; 

      try 
      { 
       sqlConnection.Open(); 

       sqlDataReader = sqlCommand.ExecuteReader(CommandBehavior.CloseConnection); 

       if (sqlDataReader.HasRows) 
       { 
        sqlDataReader.Read(); 
        membershipUser = GetUserFromReader(sqlDataReader); 

        if (userIsOnline) 
        { 
         SqlCommand sqlUpdateCommand = new SqlCommand("User_UpdateActivityDate_ByUserID", sqlConnection); 

         sqlUpdateCommand.CommandType = CommandType.StoredProcedure; 
         sqlUpdateCommand.Parameters.Add("@userID", SqlDbType.NVarChar, 255).Value = userID; 
         sqlUpdateCommand.Parameters.Add("@applicationName", SqlDbType.NVarChar, 255).Value = applicationName; 
         sqlUpdateCommand.ExecuteNonQuery(); 
        } 
       } 
      } 
      catch (SqlException e) 
      { 
       //Add exception handling here. 
      } 
      finally 
      { 
       if (sqlDataReader != null) { sqlDataReader.Close(); } 
      } 

      return membershipUser; 

     } 

编码密码:

private string EncodePassword(string password) 
     { 
      string encodedPassword = password; 

      switch (PasswordFormat) 
      { 
       case MembershipPasswordFormat.Clear: 
        break; 
       case MembershipPasswordFormat.Encrypted: 
        encodedPassword = Convert.ToBase64String(EncryptPassword(Encoding.Unicode.GetBytes(password))); 
        break; 
       case MembershipPasswordFormat.Hashed: 
        HMACSHA1 hash = new HMACSHA1(); 
        hash.Key = HexToByte(machineKey.ValidationKey); 
        encodedPassword = Convert.ToBase64String(hash.ComputeHash(Encoding.Unicode.GetBytes(password))); 
        break; 
       default: 
        throw new ProviderException("Unsupported password format."); 
      } 

      return encodedPassword; 
     } 

给定的字符串密码的Gowtham 1

更新时间:

public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) 
     { 

      ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(username, password, true); 

      OnValidatingPassword(args); 

      if (args.Cancel) 
      { 
       status = MembershipCreateStatus.InvalidPassword; 
       return null; 
      } 

      if ((RequiresUniqueEmail && (GetUserNameByEmail(email) != String.Empty))) 
      { 
       status = MembershipCreateStatus.DuplicateEmail; 
       return null; 
      } 

      MembershipUser membershipUser = GetUser(username, false); 

      if (membershipUser == null) 
      { 
       System.DateTime createDate = DateTime.Now; 

       SqlConnection sqlConnection = new SqlConnection(connectionString); 
       SqlCommand sqlCommand = new SqlCommand("User_Ins", sqlConnection); 

       sqlCommand.CommandType = CommandType.StoredProcedure; 
       sqlCommand.Parameters.Add("@returnValue", SqlDbType.Int, 0).Direction = ParameterDirection.ReturnValue; 
       sqlCommand.Parameters.Add("@username", SqlDbType.NVarChar, 255).Value = username; ; 
       sqlCommand.Parameters.Add("@applicationName", SqlDbType.NVarChar, 255).Value = applicationName; 
       sqlCommand.Parameters.Add("@password", SqlDbType.NVarChar, 255).Value = EncodePassword(password); 
       sqlCommand.Parameters.Add("@email", SqlDbType.NVarChar, 128).Value = email; 
       sqlCommand.Parameters.Add("@passwordQuestion", SqlDbType.NVarChar, 255).Value = passwordQuestion; 
       sqlCommand.Parameters.Add("@passwordAnswer", SqlDbType.NVarChar, 255).Value = EncodePassword(passwordAnswer); 
       sqlCommand.Parameters.Add("@isApproved", SqlDbType.Bit).Value = isApproved; 
       sqlCommand.Parameters.Add("@comment", SqlDbType.NVarChar, 255).Value = String.Empty; 

       try 
       { 
        sqlConnection.Open(); 

        sqlCommand.ExecuteNonQuery(); 
        if ((int)sqlCommand.Parameters["@returnValue"].Value == 0) 
        { 

         status = MembershipCreateStatus.Success; 
        } 
        else 
        { 
         status = MembershipCreateStatus.UserRejected; 
        } 
       } 
       catch (SqlException e) 
       { 
        //Add exception handling here. 

        status = MembershipCreateStatus.ProviderError; 
       } 
       finally 
       { 
        sqlConnection.Close(); 
       } 

       return GetUser(username, false); 
      } 
      else 
      { 
       status = MembershipCreateStatus.DuplicateUserName; 
      } 

      return null; 
     } 
+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

+1

你已经包含了错误的代码,你已经包含'GetUser'方法而不是'CreateUser'方法。 – mattmanser

+1

使用断点来遍历代码,直到出现错误,然后在此处发布细节。 –

回答

-1

使用调试器来找出发生了什么。

如果你不知道该怎么做,然后,加入这一行:在你的CREATEUSER方法

if(password == null) 
    throw new Exception("Password is null here, I get it, now I'll try to find where is wrong!"); 

此行之前:

ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(username, password, true); 

,并再次运行,看看是否有什么发生。

+0

错误代码为{System.Data.SqlClient.SqlException(0x80131904):找不到存储过程'User_Sel'。 at System.Data.SqlClient.SqlConnection.OnError – GowthamanSS

+0

我正确得到密码 – GowthamanSS

+0

然后检查存储过程,以确保它存在于数据库中。并确保你已连接正确的数据库。 – deerchao

0

一个猜测,但我敢打赌,它不是password变量,这是因为你试图编码passwordAnswer,你没有通过,或传入一个空值。你可能没有使用这个功能,这是一种过时和危险的恢复MS尚未弃用的密码的方式。

这条线CreateUser

sqlCommand.Parameters.Add("@passwordAnswer", SqlDbType.NVarChar, 255).Value = EncodePassword(passwordAnswer); \\THIS LINE IS PROBABLY THE PROBLEM 

试试这个,但前提是你绝对不能使用该功能:

sqlCommand.Parameters.Add("@passwordAnswer", SqlDbType.NVarChar, 255).Value = passwordAnswer; 

你应该能够在调试容易检查。