2012-11-15 162 views
10

在我使用Forms Authentication(通过SimpleMembership)的ASP.NET MVC应用程序中,如何删除用户/帐户?如何删除SimpleMembership用户?

WebSecurity类不公开DeleteUser。在百灵,我试过:

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

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

但抱怨说我还没有初始化SimpleMembership提供程序。无论如何,我非常感谢一些示例代码,它展示了如何删除用户。谢谢!

鲍勃

回答

7

,如果你只是做Membership.DeleteUser(username,true)会发生什么。您可能会在Membership上收到一条使用指令的提示。如果您正确配置了它,则不需要创建新的SimpleMembershipProvider实例。

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

你的供应商我有这样的错误对于该讨论并在此解决:Membership.DeleteUser is not deleting all related rows of the user

+0

它会引发NotSupportedException:不支持指定的方法。 –

+0

我不知道NotSupportedException是什么。我可能没有正确初始化SimpleMembership claptrap。经过多次试验和错误之后,我认为我已经获得了所有的代码(代码优先迁移和SimpleMembership),愉快地连接起来,现在Membership.DeleteUser开心地工作。 –

+1

Bob.at.SBS在下面看到我的评论,这意味着该类正在击中不实现该方法的提供者。 – ProVega

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); 
     } 
    } 
+0

osiris97的答案是更完整的角色处理。核实。 – PussInBoots

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); 
    } 
} 
+0

没有碰到违反约束的情况,所以非常好的加法。 “TODO:添加删除逻辑”注释是由我在Visual Studio中创建的默认MVC应用程序自动生成的。 – PussInBoots

+1

优秀的解决方案。这应该是被接受的答案。 – Gaui

+0

@Gaui同意。非常好的解决方案谢谢osiris97 –

0

嘿只是想发布此运行任何人到ObjectContext的状态问题下面PussInBoots例子,因为我有同样的问题后...

如果您正在访问额外的用户数据,您需要使用从数据上下文中删除该用户:

context.Users.Remove(user); 

相反比:

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

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

1

运行我的单元测试时,我收到来自Membership.DeleteUser的异常System.NotSupportedException。问题是app.config的“DefaultProvider”设置为“ClientAuthenticationMembershipProvider”,您可以看到here是“此类不使用”。

定盘来更新我的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>