Как удалить пользователя 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 и удалить пользователя из базы данных.