문제

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/

기본적으로 다음을 수행해야합니다 (완전성을 위해 위의 링크에서 복사했습니다).

  1. 새 이메일 주소를 사용하여 새 사용자를 만듭니다
  2. 이전 계정의 비밀번호를 가져와 새 계정으로 설정하십시오. 멤버십 제공 업체를 통해 이전 비밀번호를 얻을 수없는 경우 사용자에게 문의하십시오.
  3. 새 사용자 계정에 대한 새 프로필을 만듭니다
  4. 이전 프로파일에서 새 프로파일 객체로 모든 속성을 복사하십시오.
  5. 이전 계정에서 사용자를 로그 아웃하십시오
  6. 새 계정에 자동 로그인하여 사용자가 방금 놀라운 일이 발생한 일을 알지 못하게합니다.

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);                
        }
    }

아니요, 멤버쉽 사용자 클래스는 사용자 이름 속성을 수정하여 수행 할 수 없습니다.

실제로 사용자 이름이 변경되지 않아야합니다. 당신이 어떻게 그렇게 할 수 있다면, 그것은 그 목적과 자연을 잃게 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top