是否可以使用Membership API更改用户名

Bob*_*tiz 32 membership asp.net asp.net-membership sqlmembershipprovider membership-provider

我使用ASP.NET的默认sql成员资格提供程序,我想提供一个页面来更改用户的用户名.我相信我确信我可以使用自定义提供程序执行此操作,但是可以使用默认提供程序完成吗?

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

Jon*_*and 24

确实,默认的SQL成员资格提供程序不允许更改用户名.但是,如果您的站点上有有效参数,则没有内在的理由阻止用户更改其用户名,以允许用户使用.SQL数据库中的所有表都没有用户名作为键,所有内容都基于用户的ID,因此从实现的角度来看,这将非常简单.

  • 如果您的代码在更新后仍然将过时的用户名传递给提供程序,那么Toby是对的,您显然会遇到问题.否则,没有不利影响. (3认同)

Chr*_*s S 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;
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)