是否有可能与会员API更改用户名(Is it possible to change the user

2019-06-23 10:17发布

我使用的ASP.NET默认的SQL成员资格的供应者,我想提供一个页面更改用户的用户名。 我相信,我相信我可以用自定义提供这样做,但可以用这个默认的提供做些什么呢?

我的问题的第二部分是:我应该允许创建帐户后用户更改他们的用户名?

Answer 1:

这是真的,默认SQL成员资格提供不允许用户名的变化。 然而,有没有内在的原因,以防止用户更改他们的用户名,如果你有一个有效的论证,在您的网站,允许它。 在SQL数据库中的表都没有用户名作为重点,一切都是基于用户的ID,所以从实现的角度来看这将是相当容易的。



Answer 2:

如果使用SqlMembershipProvider ,你可以扩展它-它也涉及到这个问题 。
团队:Roadkill是一个wiki引擎不是我的编码风格的说明。

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


Answer 3:

斯科特·米切尔描述如何在这里处理这种情况有很大的文章: http://www.4guysfromrolla.com/articles/070109-1.aspx

从他的文章很重要的报价:

不幸的是,理想主义和实用主义很少相交。 在某些情况下-比如允许用户更改他们的用户名-我们别无选择,只能直接与底层数据存储工作。

他还展示了改变他们的用户名/电子邮件后如何重新认证用户。



Answer 4:

如果你想要做的是与会员API,它似乎是正确的方法是这样的:

http://omaralzabir.com/how_to_change_user_name_in_asp_net_2_0_membership_provider/

基本上,你必须做到以下几点(我从上面的链接复制,为了完整起见):

  1. 创建使用新的电子邮件地址的新用户
  2. 获取旧帐户的密码,并将其设置为新的帐户。 如果你不能得到通过会员提供的旧密码,然后要求用户。
  3. 创建新的用户帐户的新配置文件
  4. 复制从旧的配置文件到新的配置对象的所有属性。
  5. 注销旧帐户的用户
  6. 在新的账户自动登录,这样用户不会注意到什么不可思议的事情发生了。


Answer 5:

由于Membershiop API不直接允许用户名的修改,您可以直接访问aspnet_Membership数据库中的表。



Answer 6:

这里是一个融合了企业库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);                
        }
    }


Answer 7:

不,类的MembershipUser不允许修改用户名属性,所以你不能做到这一点。

实际上你不应该允许用户名更改。 如果允许这样做不知何故那么它将失去其目的和性质。



文章来源: Is it possible to change the username with the Membership API