asp.net - usernamepasswordvalidator - ¿Es posible cambiar el nombre de usuario con la API de membresía?
wcf seguridad username (7)
Aquí hay una versión que incorpora el DAB de Enterprise Libraries y un par de otros cambios menores. Además, no veo ningún punto en devolver un booleano, ya que o bien tendrá éxito o lanzará una excepción.
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);
}
}
Estoy utilizando el proveedor de membresía predeterminado de sql con ASP.NET y me gustaría proporcionar una página para cambiar el nombre de usuario del usuario. Creo que estoy seguro de que podría hacer esto con un proveedor personalizado, pero ¿se puede hacer con el proveedor predeterminado?
La segunda parte de mi pregunta es: ¿Debo permitir que los usuarios cambien su nombre de usuario después de crear la cuenta?
Como la API Membershiop no permite la modificación de nombre de usuario directamente, puede acceder directamente a la tabla aspnet_Membership
en su base de datos.
Es cierto que el proveedor de membresía de SQL predeterminado no permite cambios de nombre de usuario. Sin embargo, no hay ninguna razón intrínseca para evitar que los usuarios cambien sus nombres de usuario si tiene un argumento válido, en su sitio, para permitirlo. Ninguna de las tablas en la base de datos SQL tiene el nombre de usuario como clave, todo se basa en la ID del usuario, por lo que desde la perspectiva de la implementación sería bastante fácil.
No, la clase MembershipUser no permite modificar la propiedad de nombre de usuario por lo que no puede hacerlo.
Prácticamente no debes permitir que el nombre de usuario cambie. Si permites hacerlo de alguna manera, perderá su propósito y naturaleza.
Scott Mitchell tiene un gran artículo que describe cómo manejar esta situación aquí: http://www.4guysfromrolla.com/articles/070109-1.aspx
Cita importante de su artículo:
Desafortunadamente, el idealismo y el pragmatismo rara vez se cruzan. En algunos casos, como permitir que un usuario cambie su nombre de usuario, no tenemos otra opción que trabajar directamente con el almacén de datos subyacente.
También muestra cómo volver a autenticar al usuario después de cambiar su nombre de usuario / correo electrónico.
Si quieres hacer eso con la API de membresía, parece que la forma correcta sería así:
http://omaralzabir.com/how_to_change_user_name_in_asp_net_2_0_membership_provider/
Básicamente, tienes que hacer lo siguiente (copié del enlace anterior, para que esté completo):
- Crear un nuevo usuario utilizando la nueva dirección de correo electrónico
- Obtenga la contraseña de la cuenta anterior y configúrela a la nueva cuenta. Si no puede obtener la contraseña anterior a través del proveedor de Membresía, pregunte al usuario.
- Crear un nuevo perfil para la nueva cuenta de usuario
- Copie todas las propiedades del perfil antiguo al nuevo objeto de perfil.
- Cerrar sesión de usuario de la cuenta antigua
- Inicie sesión automáticamente en la nueva cuenta para que el usuario no se dé cuenta de lo increíble que acaba de suceder.
Si usa SqlMembershipProvider
, puede extenderlo, también se relaciona con esta pregunta .
Roadkill es un motor wiki que no es una descripción de mi estilo de codificación.
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;
}
}
}
}
}