2012-11-15 16 views
10

Nella mia app ASP.NET MVC utilizzando l'autenticazione basata su moduli (tramite SimpleMembership), come si elimina un utente/account?Come eliminare un utente SimpleMembership?

La classe WebSecurity non espone DeleteUser. Per scherzo, ho provato:

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

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

ma che si lamenta che non ho inizializzato il provider SimpleMembership. In ogni caso, apprezzerei molto il codice di esempio che mostra come eliminare un utente. Grazie!

Bob

risposta

7

Cosa succede se lo farete Membership.DeleteUser(username,true). Potresti ricevere un piccolo suggerimento per aggiungere una direttiva using su Membership. Se è configurato correttamente, non è necessario creare una nuova istanza SimpleMembershipProvider.

Se lo si crea al volo in questo modo, è necessario impostare le connessioni su tale oggetto e configurarlo a livello di codice (non ha indizi sulla connessione creata in precedenza). Di solito le persone lo fanno in web.config, ma se hai creato l'app utilizzando il modello di autenticazione dei moduli, allora dovresti averne cura automaticamente.

Il provider Le mie avere questo bug per il quale viene discusso e risolto qui: Membership.DeleteUser is not deleting all related rows of the user

+0

Getta NotSupportedException: Specificato metodo non è supportato. –

+0

Non so cosa riguardasse la NotSupportedException. Probabilmente non avevo il claptrap di SimpleMembership inizializzato correttamente.Dopo molte prove ed errori, penso di aver ottenuto tutti i pezzi (migrazioni code-first e SimpleMembership) cablati allegramente, e ora Membership.DeleteUser funziona felicemente. –

+1

Bob.at.SBS vedere il mio commento qui sotto, questo significa che la classe sta colpendo un provider che non implementa quel metodo. – ProVega

9

probabilmente avete bisogno di qualcosa di simile:

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

La risposta di osiris97 è più completa con la gestione dei ruoli. Controllalo. – PussInBoots

39

PussInBoots è assolutamente corretto, anche se questo getta sempre un vincolo di chiave esterna violazione per me se l'utente eliminato è stato aggiunto a qualsiasi ruolo. Sono sicuro che questo è stato dedotto dal PussInBoots' '// TODO: Aggiungi Elimina la logica qui' commento, ma io di solito ripulire le appartenenze ai ruoli prima come questo:

[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

Non si è imbattuto nella violazione del vincolo, aggiunta così eccellente. Il commento "TODO: Aggiungi eliminazione logica qui" è stato generato automaticamente dall'app MVC predefinita che ho creato in Visual Studio. – PussInBoots

+1

Ottima soluzione. Questa dovrebbe essere la risposta accettata. – Gaui

+0

@Gaui sono d'accordo. Soluzione molto bella Grazie osiris97 –

0

Hey solo voluto inviare questo per chiunque in esecuzione in questioni di stato ObjectContext dopo aver seguito PussInBoots esempio, perché ho avuto lo stesso problema ...

Se si accede dati utente aggiuntivo è necessario rimuovere l'utente dal contesto dati utilizzando:

context.Users.Remove(user); 

Piuttosto di:

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

Ciò manterrà il contesto EF aggiornato e rimuoverà l'utente dal DB.

1

Stavo ricevendo l'eccezione System.NotSupportedException da Membership.DeleteUser quando si eseguono i test di unità. Il problema era che app.config aveva il "DefaultProvider" impostato su "ClientAuthenticationMembershipProvider", che come potete vedere here è "non usato da questa classe".

La correzione è stato quello di aggiornare il mio app.config per abbinare il mio web.config e configurare correttamente il provider predefinito:

<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> 
Problemi correlati