2010-06-23 8 views
21

Mit meiner App kann ein Administrator Benutzerkonten sperren/entsperren. Ich tue dies mit dem folgenden Code:Programmgesteuertes Abmelden eines ASP.NET-Benutzers

MembershipUser user = Membership.GetUser(Guid.Parse(userId)); 
user.IsApproved = false; 
Membership.UpdateUser(user); 

Die oben genannten Arbeiten in Ordnung, den Benutzer zu sperren, aber es wird nicht widerrufen ihre Sitzung. Folglich kann der gesperrte Benutzer mit Zugriff auf die Anwendung verbleiben, solange sein Sitzungscookie verbleibt. Any fix/

Antwort

2

Überprüfen Sie auf einer allgemeinen Seite, ob das Konto gültig ist, und rufen Sie Session.Abandon() auf, wenn es widerrufen wurde.

bearbeiten (Just bemerkte dies noch offen war.)

Ich weiß, das funktioniert, weil ich es tun.

Überprüfen Sie auf der Masterseite den Kontostatus. Das bedeutet auf jeder Navigation Sie haben die Möglichkeit, sie auszuloggen.

(Final) bearbeiten

Sie denken es nicht als „ich ihre Sitzung am endet,“ denken Sie an sie als „ihre Sitzung beendet sich.“

+1

Ist dies nicht nur für die aktuelle Benutzersitzung? Ich möchte die Sitzung eines anderen Benutzers verlassen ... Etwas wie Session (Benutzer) .Abandon. – Testing123

+1

@ Testing123 egrunin bedeutet, dass jeder Benutzer prüfen würde, ob sein eigenes Konto ungültig ist, wenn dies der Fall ist, würde die Anwendung ihr Cookie entfernen. – guanome

+0

Downvote, weil Sie FormsAuthentication.SignOut() benötigen; – Juan

6

Bei der Verwendung von Formularauthentifizierung:

FormsAuthentication.SignOut(); 
+3

Sie wollen Beenden Sie eine andere Sitzung, nicht die des aktuellen Benutzers, also ist dies nicht geeignet –

24

Es gibt keine Möglichkeit, eine Sitzung von ‚außen‘ die Sitzung zu verlassen. Sie müssten die Datenbank bei jedem Laden der Seite überprüfen, und wenn das Konto deaktiviert wurde, dann melden Sie sich ab. Sie könnten dies auch mit einem HttpModule erreichen, was die Dinge etwas sauberer machen würde.

Zum Beispiel:

public class UserCheckModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.PreRequestHandlerExecute += new EventHandler(OnPreRequestHandlerExecute); 
    } 

    public void Dispose() {} 

    private void OnPreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     // Get the user (though the method below is probably incorrect) 
     // The basic idea is to get the user record using a user key 
     // stored in the session (such as the user id). 
     MembershipUser user = Membership.GetUser(Guid.Parse(HttpContext.Current.Session["guid"])); 

     // Ensure user is valid 
     if (!user.IsApproved) 
     { 
      HttpContext.Current.Session.Abandon(); 
      FormsAuthentication.SignOut(); 
      HttpContext.Current.Response.Redirect("~/Login.aspx?AccountDisabled"); 
     } 
    } 
} 

Dies ist kein vollständiges Beispiel, und das Verfahren zur Bestimmung der Benutzer das Abrufen eines Schlüssels in der Sitzung angepasst werden müssen gespeichert ist, aber das sollte Ihnen den Einstieg. Bei jedem Laden der Seite wird eine zusätzliche Datenbankprüfung durchgeführt, um zu überprüfen, ob das Benutzerkonto noch aktiv ist. Es gibt jedoch keine andere Möglichkeit, diese Informationen zu überprüfen.

+0

In der Zeile 'MembershipUser user = Mitgliedschaft.GetUser (Guid.Parse (HttpContext.Current.Session [" guid "]));', meinst du wir sollte diese Zeile durch irgendeine Methode ersetzt werden, die wir verwenden, um einen Benutzer zu erhalten? Wie ein Anruf in die Datenbank? – guanome

+0

@guanome Das stimmt, ja. Im obigen Codebeispiel wird davon ausgegangen, dass Sie die Benutzer-ID in der Sitzung speichern. Der Zweck dieser Codezeile besteht darin, einen in der Sitzung gespeicherten Wert zu verwenden, um den Benutzer von der Datenbank abzurufen (wie seine ID), so dass Sie seinen Status überprüfen können. – Mun

2

Wenn Sie einen Benutzer abmelden, ist es auch eine gute Idee, die FormsAuthenticationTicket zu überschreiben.

HttpContext context = HttpContext.Current; 

//overwrite the authentication cookie 
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, context.User.Identity.Name, DateTime.Now, DateTime.Now.AddDays(-1), false, Guid.NewGuid().ToString()); 
string encrypted_ticket = FormsAuthentication.Encrypt(ticket); 

HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted_ticket); 
cookie.Expires = ticket.Expiration; 
context.Response.Cookies.Add(cookie); 

//clear all the sessions 
context.Session.Abandon(); 

//sign out and go to the login page 
FormsAuthentication.SignOut(); 
FormsAuthentication.RedirectToLoginPage(); 
Verwandte Themen