2012-11-07 1 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) 

내 클래스

로 만들 사용자 :

,210
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

잘못된 코드를 포함 시켰습니다.'CreateUser' 메소드 대신'GetUser' 메소드를 포함 시켰습니다. – 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 변수가 아니라는 사실은 내기를 전달하지 않거나 null 값을 전달하려는 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; 

당신은 디버깅에 쉽게이를 확인 할 수 있어야한다.