32

我在 ASP.NET 中使用默认的 sql 成员资格提供程序,我想提供一个页面来更改用户的用户名。我相信我确信我可以使用自定义提供程序来做到这一点,但是这可以使用默认提供程序来完成吗?

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

4

7 回答 7

24

确实,默认的 SQL Membership Provider 不允许更改用户名。但是,如果您的站点上有有效的参数允许用户更改用户名,则没有内在的理由阻止用户更改用户名。SQL 数据库中的所有表都没有用户名作为键,一切都基于用户的 ID,因此从实现的角度来看,这将是相当容易的。

于 2009-06-16T14:03:10.143 回答
12

如果你使用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;
                }
            }
        }
    }
}
于 2011-02-27T11:35:38.173 回答
4

Scott Mitchell 有一篇很棒的文章描述了如何处理这种情况: http ://www.4guysfromrolla.com/articles/070109-1.aspx

他文章中的重要引述:

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

他还展示了如何在更改用户名/电子邮件后重新验证用户。

于 2012-08-28T05:17:01.560 回答
2

如果您想使用 Membership API 做到这一点,正确的方法似乎是这样的:

http://omaralzabir.com/how_to_change_user_name_in_asp_net_2_0_membership_provider/

基本上,您必须执行以下操作(为了完整起见,我从上面的链接中复制):

  1. 使用新电子邮件地址创建新用户
  2. 获取旧账号的密码,设置为新账号。如果您无法通过会员服务提供商获取旧密码,请询问用户。
  3. 为新用户帐户创建新配置文件
  4. 将旧配置文件中的所有属性复制到新配置文件对象。
  5. 从旧帐户注销用户
  6. 自动登录到新帐户,这样用户就不会注意到刚刚发生了什么不可思议的事情。
于 2010-11-01T16:29:32.520 回答
1

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

于 2011-12-29T09:20:50.057 回答
0

这是一个包含 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);                
        }
    }
于 2014-02-17T16:42:39.080 回答
-3

不,MembershipUser 类不允许修改 Username 属性,因此您不能这样做。

实际上,您不应该允许更改用户名。如果您允许以某种方式这样做,那么它将失去其目的和性质。

于 2009-06-16T13:41:39.313 回答