Pergunta

Eu estou usando provedor de associação do padrão SQL com ASP.NET e eu gostaria de fornecer uma página para alterar o nome do usuário. Eu acredito que eu tenho certeza que eu poderia fazer isso com um provedor personalizado, mas isso pode ser feito com o provedor padrão?

A segunda parte da minha pergunta é: Devo permitir que os usuários alterem suas nome de usuário após a criação da conta?

Foi útil?

Solução

É verdade que o padrão Provider SQL Membership não permite nome de usuário muda. No entanto, não há nenhuma razão intrínseca para evitar que os usuários alterem seus nomes de usuário, se você tem um argumento válido, em seu site, para permitir que ele. Nenhuma das tabelas no banco de dados SQL têm o nome de usuário como uma chave, tudo é baseado no ID do usuário, de modo que a partir de uma perspectiva de implementação seria bastante fácil.

Outras dicas

Se você usar SqlMembershipProvider, você pode estendê-lo - ele também se refere a este pergunta .
Roadkill é um motor wiki não é uma descrição do meu estilo de codificação.

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

Scott Mitchell tem um ótimo artigo descrevendo como lidar com esta situação aqui: http: // www.4guysfromrolla.com/articles/070109-1.aspx

Citação importante do seu artigo:

Infelizmente, o idealismo e pragmatismo só raramente se cruzam. Em alguns casos - como permitir que um usuário para mudar seu nome de usuário -. Não temos escolha, mas para trabalhar diretamente com o armazenamento de dados subjacente

Ele também mostra como re-autenticar o usuário depois de mudar seu nome de usuário / e-mail.

Se você quiser fazer isso com a API Membership, parece que o caminho certo seria assim:

http://omaralzabir.com/how_to_change_user_name_in_asp_net_2_0_membership_provider/

Basicamente, você tem que fazer o seguinte (eu copiei a partir do link acima, por questão de exaustividade):

  1. Criar um novo usuário usando o novo endereço de e-mail
  2. obter a senha da conta antiga e configurá-lo para a nova conta. Se você não pode obter a senha antiga via provedor de associação, em seguida, pedir usuário.
  3. Criar um novo perfil para a nova conta de usuário
  4. Copiar todas as propriedades do perfil antigo para o novo objeto de perfil.
  5. Logout do usuário da conta de idade
  6. sinal Auto-se para a nova conta para que o usuário não percebe que uma coisa incrível aconteceu.

Desde Membershiop API não permite a modificação nome de usuário diretamente, você pode acessar diretamente a tabela de aspnet_Membership em seu banco de dados.

Aqui está uma versão que incorpora a Empresa Bibliotecas DAB e um par de outras pequenas alterações. Além disso, não vejo um ponto em retornar um booleano, uma vez que está ou vai ter sucesso ou lançar uma exceção.

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

Não, a classe MembershipUser não permite modificar a propriedade Nome de usuário para que você não pode fazê-lo.

Na prática você não deve permitir que o nome de usuário para a mudança. Se você permitir a fazê-lo de alguma forma, em seguida, ele vai perder a sua finalidade e natureza.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top