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)
내 클래스
로 만들 사용자 : ,210public 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;
}
제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –
잘못된 코드를 포함 시켰습니다.'CreateUser' 메소드 대신'GetUser' 메소드를 포함 시켰습니다. – mattmanser
오류가 발생하고 여기에 세부 정보를 게시 할 때까지 중단 점을 사용하여 코드를 단계별로 실행하십시오. –