web-dev-qa-db-ja.com

MembershipAPIでユーザー名を変更することは可能ですか?

ASP.NETでデフォルトのSQLメンバーシッププロバイダーを使用していますが、ユーザーのユーザー名を変更するためのページを提供したいと思います。カスタムプロバイダーでこれを実行できると確信していますが、デフォルトプロバイダーでこれを実行できますか?

私の質問の2番目の部分は、アカウントの作成後にユーザーがユーザー名を変更できるようにする必要があるかどうかです。

32
Bobby Ortiz

デフォルトのSQLメンバーシッププロバイダーがユーザー名の変更を許可していないのは事実です。ただし、サイトに有効な引数がある場合、ユーザーがユーザー名を変更できないようにする本質的な理由はありません。 SQLデータベースのどのテーブルにもユーザー名がキーとして含まれていません。すべてがユーザーのIDに基づいているため、実装の観点からはかなり簡単です。

24

SqlMembershipProviderを使用すると、それを拡張できます-これは この質問 にも関連します。
Roadkill はウィキエンジンであり、私のコーディングスタイルの説明ではありません。

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;
                }
            }
        }
    }
}
12
Chris S

スコットミッチェルは、この状況を処理する方法を説明する素晴らしい記事をここに持っています: http://www.4guysfromrolla.com/articles/070109-1.aspx

彼の記事からの重要な引用:

残念ながら、理想主義と実用主義はめったに交差しません。ユーザーがユーザー名を変更できるようにするなど、場合によっては、基盤となるデータストアを直接操作する以外に選択肢はありません。

また、ユーザー名/電子メールを変更した後、ユーザーを再認証する方法も示しています。

4
Nathan Prather

Membership APIを使用してこれを実行する場合、正しい方法は次のようになります。

http://omaralzabir.com/how_to_change_user_name_in_asp_net_2_0_membership_provider/

基本的に、次のことを行う必要があります(完全を期すために、上記のリンクからコピーしました)。

  1. 新しいメールアドレスを使用して新しいユーザーを作成します
  2. 古いアカウントのパスワードを取得し、新しいアカウントに設定します。メンバーシッププロバイダーから古いパスワードを取得できない場合は、ユーザーに確認してください。
  3. 新しいユーザーアカウントの新しいプロファイルを作成します
  4. 古いプロファイルから新しいプロファイルオブジェクトにすべてのプロパティをコピーします。
  5. 古いアカウントからユーザーをログアウトします
  6. 新しいアカウントに自動サインインして、ユーザーが何が起こったのか気づかないようにします。
2
Leandro Gomide

Membershiop APIではユーザー名を直接変更できないため、データベースのaspnet_Membershipテーブルに直接アクセスできます。

1
wlegend

これは、Enterprise LibrariesDABとその他のいくつかのマイナーな変更を組み込んだバージョンです。また、ブール値は成功するか例外をスローするため、ブール値を返す意味がありません。

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