2012-11-15 8 views
10

W mojej aplikacji ASP.NET MVC korzystającej z uwierzytelniania za pomocą formularzy (przez SimpleMembership), w jaki sposób mogę usunąć użytkownika/konto?Jak usunąć użytkownika SimpleMembership?

Klasa WebSecurity nie ujawnia DeleteUser. Na skowronku próbowałem:

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

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

ale to narzeka, że ​​nie zainicjowałem dostawcy SimpleMembership. W każdym razie bardzo doceniam przykładowy kod pokazujący, jak usunąć użytkownika. Dzięki!

Bob

Odpowiedz

7

Co się stanie, jeśli po prostu zrobić Membership.DeleteUser(username,true). Możesz uzyskać niewielką prośbę o dodanie dyrektywy dotyczącej używania na Membership. Jeśli masz go poprawnie skonfigurowany, nie musisz tworzyć nowej instancji SimpleMembershipProvider.

Jeśli utworzysz go w taki sposób, będziesz musiał ustawić połączenia na tym obiekcie i skonfigurować go programowo (nie ma pojęcia o połączeniu utworzonym powyżej). Zwykle ludzie robią to w web.config, ale jeśli utworzyłeś aplikację przy użyciu szablonu uwierzytelniania formularzy, powinieneś zadbać o to automatycznie.

Operator moi mają ten błąd, za które jest omówione i rozwiązane tutaj: Membership.DeleteUser is not deleting all related rows of the user

+0

rzuca NotSupportedException: Określona metoda nie jest obsługiwana. –

+0

Nie wiem, na czym polegał wyjątek NotSupportedException. Prawdopodobnie nie został poprawnie zainicjowany claptrap SimpleMembership.Po wielu próbach i błędach, wydaje mi się, że wszystkie elementy (pierwsze migracje po kodzie i SimpleMembership) zostały połączone w szczęściu, a teraz program Membership.DeleteUser z powodzeniem działa. –

+1

Bob.at.SBS zobacz mój komentarz poniżej, oznacza to, że klasa uderza dostawcę, który nie implementuje tej metody. – ProVega

9

Prawdopodobnie trzeba coś takiego:

// 
    // 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

Odpowiedź osiris97 jest bardziej kompletna z obsługą Roles. Sprawdź to. – PussInBoots

39

PussInBoots jest absolutnie poprawne, choć zawsze rzuca klucz obcy naruszenie dla mnie, jeśli usunięty użytkownik został dodany do dowolnych ról. Jestem pewien, że to było wywnioskować przez PussInBoots' «// TODO: dodaj usuń logiki tutaj» komentarz, ale ja zazwyczaj oczyścić członkostwa ról pierwszy tak:

[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

Nie dopuścił się tak gwałtownego naruszenia ograniczeń. Komentarz "TODO: Dodaj logikę usuwania tutaj" został automatycznie wygenerowany przez domyślną aplikację MVC, którą utworzyłem w Visual Studio. – PussInBoots

+1

Doskonałe rozwiązanie. To powinna być zaakceptowana odpowiedź. – Gaui

+0

@ Gaui zgadzam się. Bardzo ładne rozwiązanie Dzięki osiris97 –

0

Hej właśnie chciałem pisać to dla każdego z systemem w sprawach państwowych ObjectContext po wykonaniu przykład PussInBoots, bo miałem ten sam problem ...

przypadku uzyskiwania dostępu dodatkowych danych użytkownika, które trzeba będzie usunąć tego użytkownika z kontekstu danych przy użyciu:

context.Users.Remove(user); 

raczej niż:

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

Pozwoli to zachować aktualny kontekst EF i usunąć użytkownika z bazy danych.

1

Otrzymałem wyjątek System.NotSupportedException od Membership.DeleteUser podczas uruchamiania testów jednostkowych. Problem polegał na tym, że app.config ustawił "DefaultProvider" na "ClientAuthenticationMembershipProvider", co, jak widzisz, jest "nieużywane przez tę klasę" przez here.

Rozwiązaniem było zaktualizować app.config dopasować moje web.config i prawidłowo skonfigurować domyślnego dostawcy:

<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> 
Powiązane problemy