How to set Thread.CurrentPrincipal für den Einsatz in der gesamten Anwendung?
In einem ASP.net Anwendung ich bin mit einem Login-Steuerelement mit einem benutzerdefinierten Mitgliedschaftsanbieter, der ich schrieb. Was ich will zu tun ist, um Thread.CurrentPrincipal
auf meine benutzerdefinierte Principal-Objekt, nur nachdem der Benutzer authentifiziert ist.
Ich bin mit dem setter: Thread.CurrentPrincipal
ist, und er legt die Hauptsache für mich ist, aber auf all den daraus resultierenden threads in diesem CurrentPrincipal ist überschrieben mit den default ein.
Hier ist mein code für die Authentifizierung Ereignis des Login-Steuerelements:
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 mich anmelden mit dem Benutzernamen Ein, geht alles gut... die Validierung geht, aber ich fest die Benutzer mit dem Benutzernamen B im Identity-Objekt, das gesetzt ist, um die Hauptsache, die ich als CurrentPrincipal
Objekt.
Wenn ich überprüfen, welche Benutzer auf die CurrentPrincipal
Identität am Ende dieser Methode, Sie sagt, es Benutzer B Aber wenn ich laden einer anderen Seite und dann prüfen, welcher die Identität des CurrentPrincipal
ist, es sagt, es ist Benutzer a
So, wie kann ich mein CurrentPrincipal
Objekt persistent sein, die in allen anderen threads, und wo/Wann wird das Login-Steuerelement legen Sie die CurrentPrincipal
Objekt von Thread?
Natürlich nicht. Vielleicht wollte ich nicht Ausdrücken, mich klar genug.
InformationsquelleAutor Goran | 2009-08-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie behandeln FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs e) (in Global.asax), und setzen Sie CurrentPrincipal hier.
Ich werde versuchen, dieses Recht nun...
InformationsquelleAutor Tadas Šukys
Tadas ist nicht falsch, FormsAuthentication korrekt umgesetzt werden, wird dieses problem nicht verursachen.
Ihre Seite ist zugänglich, auch ohne Anmeldung, nur in der login-Seite, dein thread ist grundsätzlich festgelegt ist manuell von Ihnen, aber wenn Sie auf die andere URL, ist es sicher nicht, rufen Sie Ihren login-Seite auf und denken Sie daran, jede Seite läuft auf einem eigenen thread. Wenn Sie einen Antrag auf erste Seite, und legen Sie thread-Prinzip und Sie anfordern, zweite Seite in der gleichen browser-Instanz, es kann oder kann nicht den exakt gleichen thread.
Dies ist, wie FormsAuthentication funktioniert,
Wir hatten ein ähnliches Problem bei dem waren wir mit der Sitzung zu speichern bestimmte wichtige Informationen, nach dem auth-Sitzungen wurden nicht wieder aufgebaut, so schrieben wir ein HTTP-Modul, und in seiner init-Methode, die wir angebracht AfterRequestAcquired Ereignis-und in diesem Fall, Sie können schreiben Sie Ihren code zu instanziieren, die alle wichtigen user-Variablen.
InformationsquelleAutor Akash Kava
Dies ist, was ich in FormsAuthentication_OnAuthenticate Methode:
scheint es, dass es arbeitet, was er tun soll... Es ist nur so, dass wenn ich meine benutzerdefinierten principal/Identität-pair-Mädchen als e ist.Nutzer, dann habe ich die Serialisierung problem, das muss ich fix weiter... Danke Jungs...
InformationsquelleAutor Goran