2009-08-31 2 views
5

In einer ASP.net Anwendung Ich bin mit einem Login-Steuerelement mit einem benutzerdefinierten Mitgliedschaft Anbietern, die ich geschrieben habe. Was ich tun möchte, ist zu meinem benutzerdefinierten Principal-Objekt, gleich nachdem der Benutzer authentifiziert ist.Wie wird Thread.CurrentPrincipal für die Verwendung in der gesamten Anwendung festgelegt?

Ich verwende den Setter: Thread.CurrentPrincipal und es legt das Principal-Objekt für mich, aber auf allen folgenden Threads wird dieses CurrentPrincipal mit dem Standard überschrieben.

Hier ist mein Code für das Authentifizieren Ereignis der Login-Steuerelement:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) 
    { 
     string username = Login1.UserName; 
     string password = Login1.Password; 

     if (Membership.ValidateUser(username, password)) 
     { 
      var login = sender as Login; 
      var phoenixIdentity = new PhoenixIdentity("B", "Forms" , true); 
      var principal = new PhoenixPrincipal(phoenixIdentity); 

      Thread.CurrentPrincipal = principal; 
      AppDomain.CurrentDomain.SetThreadPrincipal(principal); 

      HttpContext.Current.User = principal; 

      e.Authenticated = true; 
     } 
    } 

Zum Beispiel vorstellen, dass ich mit dem Benutzernamen A anmelden, alles gut geht ... geht Validierung, aber ich hart codieren den Benutzer mit dem Benutzernamen B im Identity-Objekt, das auf das Hauptziel gesetzt ich als CurrentPrincipal Objekt festgelegt.

Wenn ich überprüfen, welche Benutzer auf die CurrentPrincipal Identität am Ende dieses Verfahrens heißt es aber Benutzer B gesetzt ist es, wenn ich eine andere Seite laden und dann überprüfen, was die Identität des CurrentPrincipal ist, sagt sie es Benutzer A ist

Also, wie kann ich mein CurrentPrincipal Objekt dauerhaft über alle anderen Threads machen, und wo/wann setzt dieses Login-Steuerelement das CurrentPrincipal Objekt des Threads?

+0

Was machst du? Möchten Sie, dass jeder als der erste angemeldete Benutzer identifiziert wird? Sie müssen die Mechanismen der Authentifizierung und Autorisierung von Webanwendungen, die Verwendung von Cookies usw. verstehen. Sie können keinen Hauptbenutzer für alle Mehrbenutzer-App-Threads festlegen. –

+0

Natürlich nicht. Vielleicht habe ich mich nicht deutlich genug ausgedrückt. – Goran

Antwort

1

Sie können FormsAuthentication_OnAuthenticate (Objektabsender, FormsAuthenticationEventArgs e) (in Global.asax) verarbeiten und CurrentPrincipal hier festlegen.


void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs e) 
{ 
var phoenixIdentity = new PhoenixIdentity("B", "Forms" , true); 
var principal = new PhoenixPrincipal(phoenixIdentity); 
e.User = principal; 
} 
+0

Lassen Sie mich das klarstellen ... Ich benutze bereits Formularauthentifizierung, wenn Sie nicht bemerkt haben ... Es ist nur, dass ich die Benutzer-ID (zusammen mit einigen anderen Benutzerinformationen) im Identity-Objekt des Threads halten möchte .CurrentPrincipal, also habe ich meine eigenen Principal- und Identity-Objekte implementiert und die Authenticate-Methode des Login-Steuerelements der Forms-Authentifizierung überschrieben. – Goran

+0

Ich werde das jetzt versuchen ... – Goran

2

Tadas ist nicht falsch, FormsAuthentication korrekt implementiert wird dieses Problem nicht verursachen.

Ihre Seite ist auch ohne Login zugänglich, nur auf der Anmeldeseite wird das Prinzip Ihres Threads manuell festgelegt, aber wenn Sie die andere URL drücken, ruft sie Ihre Anmeldeseite nicht auf und erinnert sich, dass jede Seite einzeln ausgeführt wird anderer Thread. Wenn Sie die erste Seite anfordern und das Thread-Prinzip festlegen und die zweite Seite in der gleichen Browser-Instanz anfordern, ist es möglicherweise genau der gleiche Thread.

Dies ist, wie FormsAuthentication arbeitet,

  1. Es prüft, ob Auth Cookie gesetzt wird oder nicht, es leitet dann Benutzerseite
  2. Login-Seite anmelden müssen validieren und setzen Auth Cookie, wie FormsAuthentication.SetAuthCookie
  3. Vor jeder Seite Zugriff wird Schritt 1 ausgeführt.
  4. Nach erfolgreicher Validierung von Auth Cookie, setzt ASP.NET intern den aktuellen Benutzer und alle differnet Parameter entsprechend Ihrer Mitgliedschaft Komponente.
  5. ASP.NET Global.asax Datei kann Ihnen einige Ereignisse geben, in denen Sie Ihren Code nachprüfen können, um zu prüfen, gerade nachdem Authentifizierung erfolgreich ist, können Sie Ihren gegenwärtigen Benutzer ändern, denken Sie daran, Ihr gegenwärtiges Prinzip auf Anmeldungsseite nicht zu helfen

wir hatten ähnliches Problem, wenn wir Sitzung verwendet haben einige wichtige Informationen zu speichern, nachdem auth Sitzungen nicht wieder aufgebaut wurden, so dass wir ein HTTP-Modul geschrieben, und darin init-Methode ist, legen wir bei AfterRequestAcquired Veranstaltung und in diesem Fall können Sie schreiben Ihre Code, um alle wichtigen benutzerbezogenen Variablen zu instanziieren.

1

Dies ist, was ich in FormsAuthentication_OnAuthenticate Methode tat

if (FormsAuthentication.CookiesSupported) 
     { 
      if (Request.Cookies[FormsAuthentication.FormsCookieName] != null) 
      { 
       try 
       { 
        FormsAuthenticationTicket ticket = 
         FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value); 

        var myIdentity = new GenericIdentity("B"); 
        var principal = new GenericPrincipal(myIdentity, new string[]{"rola1"}); 
        e.User = principal; 
       } 
       catch (Exception ex) 
       { 
        // Decrypt method failed. 
       } 
      } 
     } 
     else 
     { 
      throw new HttpException("Cookieless Forms Authentication is not " + 
            "supported for this application."); 
     } 

scheint es, dass es funktioniert, was es tun sollte ... Es ist nur, dass, wenn ich meine benutzerdefinierte Haupt/Identität Paar als e.User setzen, dann Ich habe Serialisierungsproblem, das ich nächste beheben muss ... Danke Jungs ...

+0

Serialisierungsproblem ging einfach weg, wenn ich zu IIS anstelle von Visual Studio Development Server wechselte. – Goran

Verwandte Themen