Как удалить пользователя SimpleMembership?
В моем приложении ASP.NET MVC с использованием проверки подлинности с помощью форм (через SimpleMembership), как мне удалить пользователя/учетную запись?
Класс WebSecurity не предоставляет DeleteUser. На жаворонке я попытался:
WebSecurity.InitializeDatabaseConnection(
"MyDbConnection", "Users", "Id", "UserName", autoCreateTables: true);
new SimpleMembershipProvider().DeleteUser(userName, true);
но жалуется, что я не инициализировал провайдера SimpleMembership. В любом случае, я был бы очень признателен за образец кода, который показывает, как удалить пользователя. Спасибо!
Боб
Ответы
Ответ 1
Что произойдет, если вы просто сделаете Membership.DeleteUser(username,true)
. Вы можете получить небольшое приглашение добавить директиву использования на Membership
. Если вы настроили его правильно, вам не нужно создавать новый экземпляр SimpleMembershipProvider.
Если вы создадите его на лету, вам нужно будет установить соединения на этом объекте и настроить его программно (он не имеет понятия о соединении, которое вы создали выше). Обычно люди делают это в web.config, но если вы создали приложение с использованием шаблона проверки подлинности форм, тогда вам следует автоматически об этом заботиться.
У вашего провайдера у меня есть эта ошибка, о которой здесь обсуждается и решается здесь: Membership.DeleteUser не удаляет все связанные строки пользователя
Ответ 2
PussInBoots абсолютно корректен, хотя это всегда вызывает нарушение ограничения внешнего ключа для меня, если удаленный пользователь был добавлен к любым ролям. Я уверен, что это было выведено комментарием PussInBoots "//TODO: Добавить удаление логики здесь", но я, как правило, сначала очищу членство ролей следующим образом:
[HttpPost]
public ActionResult Delete(string userName, FormCollection collection)
{
try
{
// TODO: Add delete logic here
if (Roles.GetRolesForUser(userName).Count() > 0)
{
Roles.RemoveUserFromRoles(userName, Roles.GetRolesForUser(userName));
}
((SimpleMembershipProvider)Membership.Provider).DeleteAccount(userName); // deletes record from webpages_Membership table
((SimpleMembershipProvider)Membership.Provider).DeleteUser(userName, true); // deletes record from UserProfile table
return RedirectToAction("Index");
}
catch
{
return View(userName);
}
}
Ответ 3
Вам, вероятно, понадобится что-то вроде этого:
//
// GET: /Members/Delete?userName=someuser
public ActionResult Delete(string userName)
{
var user = context.UserProfiles.SingleOrDefault(u => u.UserName == userName);
return View(user);
}
//
// POST: /Members/Delete?userName=someuser
[HttpPost]
public ActionResult Delete(string userName, FormCollection collection)
{
try
{
// TODO: Add delete logic here
((SimpleMembershipProvider)Membership.Provider).DeleteAccount(userName); // deletes record from webpages_Membership table
((SimpleMembershipProvider)Membership.Provider).DeleteUser(userName, true); // deletes record from UserProfile table
return RedirectToAction("Index");
}
catch
{
return View(userName);
}
}
Ответ 4
Я получал исключение System.NotSupportedException из Memberhip.DeleteUser при выполнении моих модульных тестов. Проблема заключалась в том, что app.config установил "DefaultProvider" в "ClientAuthenticationMembershipProvider", который, как вы видите, здесь, не используется этим классом ".
Исправлено обновление моего app.config в соответствии с моим web.config и правильная настройка поставщика по умолчанию:
<membership>
<providers>
<clear />
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="Crelate.Properties.Settings.DatabaseMembershipServicesConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
</providers>
</membership>
Ответ 5
Эй просто хотел опубликовать это для всех, кто сталкивается с проблемами состояния ObjectContext после следующего примера PussInBoots, потому что у меня была та же проблема...
Если вы получаете доступ к дополнительным пользовательским данным, вам нужно будет удалить этого пользователя из контекста данных, используя:
context.Users.Remove(user);
Вместо
((SimpleMembershipProvider)Membership.Provider).DeleteUser(userName, true);
Это позволит вам обновить контекст EF и удалить пользователя из базы данных.