멤버십 API로 사용자 이름을 변경할 수 있습니까?
문제
ASP.NET과 함께 기본 SQL 멤버십 제공 업체를 사용하고 있으며 사용자의 사용자 이름을 변경하기위한 페이지를 제공하고 싶습니다. 커스텀 제공 업체와 함께 할 수 있다고 확신하지만 기본 제공 업체와 함께 할 수 있습니까?
내 질문의 두 번째 부분은 다음과 같습니다. 계정이 생성 된 후 사용자가 사용자 이름을 변경할 수 있어야합니까?
해결책
기본 SQL 멤버십 제공 업체가 사용자 이름 변경을 허용하지 않는 것은 사실입니다. 그러나 사이트에 유효한 주장이있는 경우 사용자가 사용자 이름을 변경하지 못하게하는 본질적인 이유는 없습니다. SQL 데이터베이스의 테이블 중 어느 것도 사용자 이름을 키로 사용하지 않으며 모든 것이 사용자의 ID를 기반으로하므로 구현 관점에서 매우 쉽습니다.
다른 팁
사용하는 경우 SqlMembershipProvider
, 당신은 그것을 확장 할 수 있습니다 - 그것은 또한 이 질문.
로드 킬 내 코딩 스타일에 대한 설명이 아닌 위키 엔진입니다.
using System;
using System.Web.Security;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
using System.Web.Configuration;
namespace Roadkill.Core
{
public class RoadkillMembershipProvider : SqlMembershipProvider
{
private string _connectionString;
protected string ConnectionString
{
get
{
if (string.IsNullOrWhiteSpace(_connectionString))
{
Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
MembershipSection section = config.SectionGroups["system.web"].Sections["membership"] as MembershipSection;
string defaultProvider = section.DefaultProvider;
string connstringName = section.Providers[defaultProvider].ElementInformation.Properties["connectionStringName"].Value.ToString();
_connectionString = config.ConnectionStrings.ConnectionStrings[connstringName].ConnectionString;
}
return _connectionString;
}
}
public bool ChangeUsername(string oldUsername, string newUsername)
{
if (string.IsNullOrWhiteSpace(oldUsername))
throw new ArgumentNullException("oldUsername cannot be null or empty");
if (string.IsNullOrWhiteSpace(newUsername))
throw new ArgumentNullException("newUsername cannot be null or empty");
if (oldUsername == newUsername)
return true;
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
connection.Open();
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = "UPDATE aspnet_Users SET UserName=@NewUsername,LoweredUserName=@LoweredNewUsername WHERE UserName=@OldUsername";
SqlParameter parameter = new SqlParameter("@OldUsername", SqlDbType.VarChar);
parameter.Value = oldUsername;
command.Parameters.Add(parameter);
parameter = new SqlParameter("@NewUsername", SqlDbType.VarChar);
parameter.Value = newUsername;
command.Parameters.Add(parameter);
parameter = new SqlParameter("@LoweredNewUsername", SqlDbType.VarChar);
parameter.Value = newUsername.ToLower();
command.Parameters.Add(parameter);
return command.ExecuteNonQuery() > 0;
}
}
}
}
}
Scott Mitchell 은이 상황을 여기에서 처리하는 방법을 설명하는 훌륭한 기사를 가지고 있습니다. http://www.4guysfromrolla.com/articles/070109-1.aspx
그의 기사에서 중요한 인용문 :
불행히도, 이상주의와 실용주의는 거의 교차하지 않습니다. 경우에 따라 사용자가 사용자 이름을 변경하도록 허용하는 경우에 따라 기본 데이터 저장소와 직접 작업하는 것 외에는 선택의 여지가 없습니다.
또한 사용자 이름/이메일을 변경 한 후 사용자를 다시 평가하는 방법을 보여줍니다.
멤버십 API로 그렇게하고 싶다면 올바른 방법은 다음과 같을 것 같습니다.
http://omaralzabir.com/how_to_change_user_name_in_asp_net_2_0_membership_provider/
기본적으로 다음을 수행해야합니다 (완전성을 위해 위의 링크에서 복사했습니다).
- 새 이메일 주소를 사용하여 새 사용자를 만듭니다
- 이전 계정의 비밀번호를 가져와 새 계정으로 설정하십시오. 멤버십 제공 업체를 통해 이전 비밀번호를 얻을 수없는 경우 사용자에게 문의하십시오.
- 새 사용자 계정에 대한 새 프로필을 만듭니다
- 이전 프로파일에서 새 프로파일 객체로 모든 속성을 복사하십시오.
- 이전 계정에서 사용자를 로그 아웃하십시오
- 새 계정에 자동 로그인하여 사용자가 방금 놀라운 일이 발생한 일을 알지 못하게합니다.
Membershiop API는 사용자 이름 수정을 직접 허용하지 않으므로 직접 액세스 할 수 있습니다. aspnet_Membership
데이터베이스의 테이블.
다음은 Enterprise Libraries DAB와 다른 몇 가지 사소한 변경 사항을 통합 한 버전입니다. 또한 부울을 되 찾는 데 있어서는 성공하거나 예외를 던지기 때문에 부울을 반환하는 데 요점이 없습니다.
public static void ChangeUsername(string oldUsername, string newUsername)
{
if (string.IsNullOrWhiteSpace(oldUsername))
{
throw new ArgumentNullException("oldUsername cannot be null or empty");
}
if (string.IsNullOrWhiteSpace(newUsername))
{
throw new ArgumentNullException("newUsername cannot be null or empty");
}
if (oldUsername.Equals(newUsername))
{
return;
}
Database db = DatabaseFactory.CreateDatabase();
using (DbCommand cmd = db.GetSqlStringCommand("UPDATE dbo.aspnet_Users SET UserName=@NewUsername, LoweredUserName=@LoweredNewUsername WHERE UserName=@OldUsername"))
{
db.AddInParameter(cmd, "@OldUsername", DbType.String, oldUsername);
db.AddInParameter(cmd, "@NewUsername", DbType.String, newUsername);
db.AddInParameter(cmd, "@LoweredNewUsername", DbType.String, newUsername.ToLower());
db.ExecuteNonQuery(cmd);
}
}
아니요, 멤버쉽 사용자 클래스는 사용자 이름 속성을 수정하여 수행 할 수 없습니다.
실제로 사용자 이름이 변경되지 않아야합니다. 당신이 어떻게 그렇게 할 수 있다면, 그것은 그 목적과 자연을 잃게 될 것입니다.