10

在使用表单身份验证(通过 SimpleMembership)的 ASP.NET MVC 应用程序中,如何删除用户/帐户?

WebSecurity 类不公开 DeleteUser。在云雀上,我尝试了:

WebSecurity.InitializeDatabaseConnection(
  "MyDbConnection", "Users", "Id", "UserName", autoCreateTables: true);

new SimpleMembershipProvider().DeleteUser(userName, true);

但这抱怨我没有初始化 SimpleMembership 提供程序。无论如何,我将非常感谢一些显示如何删除用户的示例代码。谢谢!

鲍勃

4

5 回答 5

39

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);
    }
}
于 2013-02-27T13:41:14.793 回答
9

你可能需要这样的东西:

    //
    // 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);
        }
    }
于 2012-11-24T17:58:14.300 回答
7

如果你只是这样做会发生什么Membership.DeleteUser(username,true)。您可能会收到一点提示,要求您在Membership. 如果配置正确,则不需要创建新的 SimpleMembershipProvider 实例。

如果您像这样动态创建它,则需要在该对象上设置连接并以编程方式对其进行配置(它不知道您在上面创建的连接)。通常人们在 web.config 中执行此操作,但如果您使用表单身份验证模板创建应用程序,那么您应该自动处理该问题。

您的提供商我有这个错误,在这里讨论和解决:Membership.DeleteUser 没有删除用户的所有相关行

于 2012-11-15T03:37:27.030 回答
1

运行单元测试时,我从 Membership.DeleteUser收到异常System.NotSupportedException 。问题是 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>
于 2013-04-23T23:45:10.793 回答
0

嘿只是想在遵循 PussInBoots 示例之后为遇到 ObjectContext 状态问题的任何人发布此信息,因为我遇到了同样的问题......

如果您正在访问其他用户数据,则需要使用以下方法从数据上下文中删除该用户:

context.Users.Remove(user);

而不是:

((SimpleMembershipProvider)Membership.Provider).DeleteUser(userName, true);

这将使您的 EF 上下文保持最新并从数据库中删除用户。

于 2013-04-01T22:30:58.843 回答