Возможно ли изменить имя пользователя с помощью API членства?
Я использую поставщик членства по умолчанию sql с ASP.NET, и я хотел бы предоставить страницу для изменения имени пользователя. Я уверен, что я могу сделать это с помощью настраиваемого поставщика, но можно ли это сделать с помощью поставщика по умолчанию?
Вторая часть моего вопроса:
Должен ли я разрешать пользователям изменять свое имя пользователя после создания учетной записи?
Ответы
Ответ 1
Это правда, что по умолчанию SQL Memberhip Provider не позволяет изменять имя пользователя. Однако нет никаких оснований для того, чтобы пользователи не изменяли свои имена пользователей, если у вас есть допустимый аргумент на вашем сайте, чтобы разрешить его. Ни одна из таблиц в базе данных SQL не имеет имени пользователя в качестве ключа, все основано на идентификаторе пользователя, поэтому с точки зрения реализации это будет довольно легко.
Ответ 2
Если вы используете SqlMembershipProvider
, вы можете его расширить - это также относится к этому вопросу.
Roadkill - это механизм вики, не являющийся описанием моего стиля кодирования.
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 [email protected],[email protected] WHERE [email protected]";
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;
}
}
}
}
}
Ответ 3
У Скотта Митчелла есть отличная статья, описывающая, как справиться с этой ситуацией здесь: http://www.4guysfromrolla.com/articles/070109-1.aspx
Важная цитата из его статьи:
К сожалению, идеализм и прагматизм редко пересекаются. В некоторых случаях - например, позволяя пользователю изменять свое имя пользователя - у нас нет выбора, кроме как напрямую работать с базовым хранилищем данных.
Он также показывает, как повторно аутентифицировать пользователя после изменения имени пользователя/электронной почты.
Ответ 4
Если вы хотите сделать это с помощью API членства, кажется, что правильный путь будет таким:
http://omaralzabir.com/how_to_change_user_name_in_asp_net_2_0_membership_provider/
В принципе, вы должны сделать следующее (я скопировал из приведенной выше ссылки для полноты):
- Создайте нового пользователя, используя новый адрес электронной почты
- Получите пароль старой учетной записи и установите ее в новую учетную запись. Если вы не можете получить старый пароль через членство, обратитесь к пользователю.
- Создайте новый профиль для новой учетной записи пользователя
- Скопировать все свойства из старого профиля в новый объект профиля.
- Выйти из старой учетной записи
- Автоматический вход в новую учетную запись, чтобы пользователь не заметил, что произошло просто невероятно.
Ответ 5
Так как API Membershiop не позволяет напрямую изменять имя пользователя, вы можете напрямую получить таблицу aspnet_Membership
в своей базе данных.
Ответ 6
Здесь приведена версия, которая включает DAB Enterprise Libraries и пару других незначительных изменений. Кроме того, я не вижу смысла возвращать Boolean, поскольку он либо преуспевает, либо генерирует исключение.
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 [email protected], [email protected] WHERE [email protected]"))
{
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);
}
}
Ответ 7
Нет, класс MembershipUser не позволяет изменять свойство Username, поэтому вы не можете этого сделать.
Фактически вы не должны позволять изменять имя пользователя. Если вы позволите сделать это как-то, тогда он потеряет свою цель и природу.