2009-04-28 5 views
0

Ich entwickle eine Webanwendung, die einen internen SSO-Server für die Authentifizierung verwendet. Ich habe einen Link auf meiner Homepage zu einer Seite namens Logout.aspx. Logout.aspx löscht das Cookie für die Formularauthentifizierung, alle Sitzungsdaten und führt dann eine Umleitung zu der LoginUrl durch, die in der Formularauthentifizierungskonfiguration angegeben ist, die derzeit auf einer Seite namens Login.aspx festgelegt ist.Wie erhalten Sie die Referrer-URL in ASP.NET, wenn mehrere Weiterleitungen vorhanden sind?

Wenn jedoch Login.aspx geladen wird, wird versucht, den Benutzer implizit gegen den SSO-Server mit dem zuvor ausgestellten SSO-Authentifizierungsticket erneut zu authentifizieren. Wenn dieses Ticket noch vorhanden ist, wird der vorherige Benutzer erneut angemeldet und an die Homepage zurückgesendet. Ich möchte beim Laden der Anmeldeseite feststellen, ob die Anfrage über die Abmeldeseite erfolgt ist. Die UrlReferrer-Eigenschaft der Anforderung verweist weiterhin auf Home.aspx, vermutlich weil dies die letzte URL war, die der Client angefordert hat.

Zur Zeit habe ich eine Problemumgehung, bei der ich eine Anfrage an die Anfrage von der Abmeldeseite anfügt, die die Anmeldeseite anweist, keine implizite Anmeldung durchzuführen und stattdessen den Benutzer zur Eingabe von Anmeldeinformationen auffordert. Wie kann ich programmgesteuert feststellen, ob die Anfrage über eine Umleitung von der Abmeldeseite kam?

bearbeiten 29.04.2009:

das Gespräch mit jellomonkey Folgen, soll ich darauf hinweisen, dass die Interaktion zwischen dem SSO-Server und der lokalen Formularauthentifizierung der konsumiere Website des nicht direkt relevant ist Problem zur Hand. kurz und bündig ausgedrückt, mein Problem ist:

  1. Benutzer HTML klickt Hyperlink von Home.aspx, die sie
  2. Page_Load-Ereignishandler Logout.aspx nimmt von Logout.aspx zu Formularauthentifizierungsticket und Sitzungsdaten und leitet den Benutzer löscht Login.aspx
  3. Das Page_Load-Ereignis von Login.aspx überprüft die UrlReferrer-Eigenschaft des Request-Objekts, um festzustellen, ob die Anforderung über die Seite Logout kam. Bei Anforderungen, die über eine Umleitung von Logout.aspx stammen, ist die UrlReferrer-Eigenschaft des Request-Objekts jedoch Home.aspx.

Warum ist das? Warum ist der UrlReferrer Home.aspx und nicht Logout.aspx?

+0

Wie werden Sie umleiten, verwenden Sie Response.Redirect oder Server.Transfer? – wweicker

+0

Seanix - Ich benutze Response.Redirect – pmarflee

+0

Die UrlReferrer ist die Client-Maschinen vorherige Anfrage, so dass die verschiedenen Verhaltensweisen von Resp Onse.Redirect und Server.Transfer hätte ich vermutet, dass Server.Transfer wie beschrieben fehlschlagen würde und dass Response.Redirect funktionieren würde. Entschuldigung, ich kann die ursprüngliche Frage nicht beantworten, aber ich könnte alternative Lösungen anbieten ... – wweicker

Antwort

3

Das von Ihnen beschriebene Szenario sollte ordnungsgemäß funktionieren, es sei denn, auf der Abmeldeseite wird das Formularauthentifizierungs-Cookie tatsächlich gelöscht. Es gibt mehrere Möglichkeiten, um die Formularauthentifizierung Sitzung zu beenden:

//I have seen instances where this does not work. 
FormsAuthentication.SignOut() 


//I have not seen this code fail before. 
Dim cookie As HttpCookie = FormsAuthentication.GetAuthCookie(_ 
    HttpContext.Current.User.Identity.Name, False) 
cookie.Expires = Date.Now.AddDays(-1) 


Response.Clear() 
Response.AppendCookie(cookie) 
Response.Redirect(FormsAuthentication.LoginUrl) 

Auch wenn Sie eine Rolle Manager verwenden, die in einem Cookie gespeichert erinnern Roles.DeleteCookie() aufzurufen.

Bearbeiten: Als Antwort auf die aktualisierte Frage.

Die Response.Redirect-Methode gibt keinen Header mit einem neuen URL-Verweis zurück, da die Spezifikation angibt, dass nur von Clients initiierte Anfragen einen Referrer-Header enthalten sollten. Hier ist die Response.Redirect, den Sie sehen nicht den Header Referrer ändern:

Public Sub Redirect(ByVal url As String, ByVal endResponse As Boolean) 
If (url Is Nothing) Then 
    Throw New ArgumentNullException("url") 
End If 
If (url.IndexOf(ChrW(10)) >= 0) Then 
    Throw New ArgumentException(SR.GetString("Cannot_redirect_to_newline")) 
End If 
If Me._headersWritten Then 
    Throw New HttpException(SR.GetString("Cannot_redirect_after_headers_sent")) 
End If 
Dim handler As Page = TryCast(Me._context.Handler,Page) 
If ((Not handler Is Nothing) AndAlso handler.IsCallback) Then 
    Throw New ApplicationException(SR.GetString("Redirect_not_allowed_in_callback")) 
End If 
url = Me.ApplyRedirectQueryStringIfRequired(url) 
url = Me.ApplyAppPathModifier(url) 
url = Me.ConvertToFullyQualifiedRedirectUrlIfRequired(url) 
url = Me.UrlEncodeRedirect(url) 
Me.Clear 
If (((Not handler Is Nothing) AndAlso handler.IsPostBack) AndAlso (handler.SmartNavigation AndAlso (Me.Request.Item("__smartNavPostBack") = "true"))) Then 
    Me.Write("<BODY><ASP_SMARTNAV_RDIR url=""") 
    Me.Write(HttpUtility.HtmlEncode(url)) 
    Me.Write("""></ASP_SMARTNAV_RDIR>") 
    Me.Write("</BODY>") 
Else 
    Me.StatusCode = &H12E 
    Me.RedirectLocation = url 
    If ((url.StartsWith("http:", StringComparison.OrdinalIgnoreCase) OrElse url.StartsWith("https:", StringComparison.OrdinalIgnoreCase)) OrElse ((url.StartsWith("ftp:", StringComparison.OrdinalIgnoreCase) OrElse url.StartsWith("file:", StringComparison.OrdinalIgnoreCase)) OrElse url.StartsWith("news:", StringComparison.OrdinalIgnoreCase))) Then 
     url = HttpUtility.HtmlAttributeEncode(url) 
    Else 
     url = HttpUtility.HtmlAttributeEncode(HttpUtility.UrlEncode(url)) 
    End If 
    Me.Write("<html><head><title>Object moved</title></head><body>" & ChrW(13) & ChrW(10)) 
    Me.Write(("<h2>Object moved to <a href=""" & url & """>here</a>.</h2>" & ChrW(13) & ChrW(10))) 
    Me.Write("</body></html>" & ChrW(13) & ChrW(10)) 
End If 
Me._isRequestBeingRedirected = True 
If endResponse Then 
    Me.End 
End If 
End Sub 

Sie Reflektor verwenden können, den anderen Methoden zu folgen, aber ich sehe nicht ein, die jeden Kopf ändert.

+0

Der Cookie für die Formularauthentifizierung wird gelöscht. Das ist nicht das Problem. Das Problem ist: Wie kann festgestellt werden, ob eine Anfrage für die Anmeldeseite über eine Anfrage für die Abmeldeseite erfolgte? Der Benutzer klickt auf einen Link auf Home.aspx. Dies führt sie zu Logout.aspx. Logout.aspx löscht das Formularauthentifizierungs-Cookie und das Sitzungsdatum und leitet dann zu Login.aspx um. Die UrlReferrer-Eigenschaft der Anforderung von Login.aspx verweist jedoch auf Home.aspx, nicht auf Logout.aspx. Ich möchte wissen, ob die Anfrage über Logout.aspx kam, also mache ich keine "weiche" Anmeldung über den SSO-Server und fordere den Benutzer stattdessen zur Eingabe von Anmeldeinformationen auf. – pmarflee

+0

Die verweisende URL befindet sich in HttpContext.Current.Request.UrlReferrer, aber Sie haben bereits gesagt, dass Home.aspx angezeigt wird. Die einzige Möglichkeit, die ich mir vorstellen könnte, ist, wenn Ihr Logout-Link eigentlich ein Asp-HyperLink-Steuerelement war, das ein Ereignis mit einem Server ausgelöst hat.Übertragen Sie die Abmeldeseite und dann einen Server.Übertragen Sie die Anmeldeseite. Das heißt, die einzige Möglichkeit für eine "weiche" Anmeldung kann sein, wenn der Cookie für die Formularauthentifizierung nicht ordnungsgemäß gelöscht wird. – jellomonkey

+0

Der Abmeldelink ist nur ein regulärer Hyperlink-Tag; Es ist kein Code angehängt. Die Methode, mit der der "weiche" Login durchgeführt wird, ist nicht wirklich relevant für das Problem. Die Abmeldeseite führt Response.Redirect, nicht einen Server.Transfer aus. – pmarflee

1

Response.Redirect ("login.aspx?from = logout ")

  • Steve Yates
  • ITS, Inc.
  • Warum einen Bart nicht Tarzan haben

~ Taglines von Taglinator: www.srtware.com ~

Verwandte Themen