2012-11-15 170 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>