2012-07-30 5 views
5

Ich habe diesen Code, wenn Benutzer anmelden, die Zeichenfolge sUserData ist ordnungsgemäß festgelegt.Formularauthentifizierung, die Benutzer nicht ordnungsgemäß überprüft

Dim sUserData As String = HttpContext.Current.Request.Cookies("UserID").Value & "|" & HttpContext.Current.Request.Cookies("UserName").Value & "|" & HttpContext.Current.Request.Cookies("UserEmail").Value 

    Dim fat As FormsAuthenticationTicket = New FormsAuthenticationTicket(1, _ 
    HttpContext.Current.Session("UserID"), DateTime.Now, _ 
    DateTime.Now.AddDays(6), True, sUserData, _ 
    FormsAuthentication.FormsCookiePath) 
    HttpContext.Current.Response.Cookies.Add(New HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(fat))) 

Dann habe ich Code, wo ich überprüfen, ob der Benutzer, wenn in einem freigegebenen (statisch) Verfahren in einer öffentlichen Klasse wie diese Anmeldung:

If HttpContext.Current.User.Identity.IsAuthenticated Then 
EndIf 

Und das funktioniert gut, aber wenn ich setzt die gleiche Linie in Page_Load anstelle einer gemeinsamen Methode einer Klasse nie in diese If-Anweisung geht

If HttpContext.Current.User.Identity.IsAuthenticated Then 
    EndIf 

Warum ist das passiert, und ist es eine Möglichkeit, diese neu zu schreiben in der Code- zu arbeiten hinter Page_L oad, anstatt es in eine Klasse zu legen, wird die Klasse in einer Kopfzeile verwendet, um den Zugriff auf bestimmte Seiten zu ermöglichen - damit das funktioniert. Aber ich brauche eine andere Art der Authentifizierung des Benutzers auf der Seite "Standard", um die Labels und Schaltflächen basierend auf dem Wetter, in dem der Benutzer angemeldet ist, zu ändern, und dies kann nicht in einer Klasse erfolgen.

+0

Gibt es einen bestimmten Grund, warum Sie dieses Cookie manuell erstellen, anstatt 'FormsAuthentication.SetAuthCookie()' zu verwenden? Ihr Code funktioniert möglicherweise, aber .NET erledigt das für Sie. (nur eine Beobachtung). –

+0

ja, es gibt - es muss so sein, es gibt bereits 10k plus Benutzer, und meine Aufgabe ist es nicht, alles zu ändern, nur meinen Code arbeiten mit bestehenden db –

+0

Versuchen Sie nicht, die Flagge in der überprüfen SAME Anfrage Sie erstellen den Cookie? Dies wird nicht funktionieren, da der Kontext ausgehend von einer Anfrage neben der, die Sie gesetzt haben, gesetzt wird. –

Antwort

2

Haben Sie versucht, die Seitenereignisüberschreibungen in eine tatsächliche Seitenereignisüberschreibung (d. H. OnLoad) anstelle der Page_Load-Event-Hook-Implementierung einzufügen? Leistungsstärker (weniger Aufrufebenen), leichter Unterschied im Lebenszyklus, der Ihren Bedürfnissen entspricht und die Ursache dieser Symptome auflösen kann.

Dort kann ein Sequencing-Problem/Race-Bedingung sein, wenn der Kontext der statischen Methode aufrufen und die Page_Load, denke ich Wiktor Zychla wies Sie in Richtung Fiddler bereits.

+0

Ich fand es heraus, das war in der richtigen Richtung - meine sUserData war immer korrekt, aber ich habe nicht erkannt, dass die Sitzung (" UserID ") dann nicht festgelegt wurde Das ganze Authentifizierungsticket wird nicht gesetzt, tatsächlich wird es gesetzt, aber der Wert ist leer –