سؤال

أنا أستخدم موفر عضوية SQL الافتراضي مع ASP.NET وأرغب في توفير صفحة لتغيير اسم المستخدم الخاص بالمستخدم.أعتقد أنني متأكد من أنه يمكنني القيام بذلك مع موفر مخصص، ولكن هل يمكن القيام بذلك مع الموفر الافتراضي؟

الجزء الثاني من سؤالي هو:هل يجب أن أسمح للمستخدمين بتغيير اسم المستخدم الخاص بهم بعد إنشاء الحساب؟

هل كانت مفيدة؟

المحلول

وصحيح أن مقدم العضوية SQL الافتراضي لا يسمح تغييرات اسم المستخدم. ومع ذلك، ليس هناك سبب جوهري لمنع المستخدمين من تغيير ألقابهم إذا كان لديك حجة صحيحة، على موقع الويب الخاص بك، لتسمح بذلك. أي من الجداول في قاعدة البيانات SQL يكون اسم المستخدم كمفتاح، ويستند كل شيء على هوية المستخدم، وذلك من وجهة نظر التنفيذ سيكون من السهل إلى حد ما.

نصائح أخرى

إذا كنت تستخدم 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;
                }
            }
        }
    }
}

لدى سكوت ميتشل مقالة رائعة تصف كيفية التعامل مع هذا الموقف هنا: http://www.4guysfromrolla.com/articles/070109-1.aspx

اقتباس مهم من مقالته:

ومن المؤسف أن المثالية والبراغماتية نادرا ما تتقاطعان.في بعض الحالات - مثل السماح للمستخدم بتغيير اسم المستخدم الخاص به - ليس لدينا خيار سوى العمل مباشرة مع مخزن البيانات الأساسي.

ويوضح أيضًا كيفية إعادة مصادقة المستخدم بعد تغيير اسم المستخدم/البريد الإلكتروني الخاص به.

إذا كنت تريد القيام بذلك باستخدام Membership 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 في قاعدة البيانات الخاصة بك.

وهنا نسخة يدمج 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);                
        }
    }

لا، الطبقة MembershipUser لا يسمح لتعديل الخاصية اسم المستخدم وبالتالي لا يمكنك أن تفعل ذلك.

وعمليا يجب أن لا تسمح اسم المستخدم للتغيير. إذا سمحت للقيام بذلك بطريقة أو بأخرى بعد ذلك سوف تفقد هدفها وطبيعتها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top