2009-04-28 17 views
0

私は社内のSSOサーバーを使用して認証を行うWebアプリケーションを開発しています。私は私のホームページにLogout.aspxというページへのリンクを持っています。 Logout.aspxはForms認証Cookieとすべてのセッションデータを消去し、現在Login.aspxというページに設定されているフォーム認証構成で指定されたLoginUrlへのリダイレクトを実行します。複数のリダイレクトがある場合、ASP.NETの参照元URLを取得する方法は?

ただし、Login.aspxが読み込まれると、以前に発行されたSSO認証チケットを使用して、SSOサーバーに対してユーザーを暗黙的に再認証しようとします。このチケットがまだ存在する場合、前のユーザーはログインしてホームページに戻されます。ログインページが読み込まれたときに、ログアウトページからのリクエストかどうかを確認したいと思います。要求のUrlReferrerプロパティはHome.aspxを引き続き参照します。これは、クライアントが要求した最後のURLであったと考えられます。

現時点では、暗黙的なログインを実行せず、代わりにユーザーに資格情報の入力を求めるログアウトページからの要求にクエリ文字列変数を追加する回避策があります。要求がログアウトページからのリダイレクトを経由したものかどうかをプログラムで判断するにはどうすればよいですか?

編集29/04/2009:

jellomonkeyとの会話の後、私は、SSOサーバと消費のウェブサイトのローカルフォーム認証の間の相互作用は直接関連していないことを指摘すべきです手元の問題。簡潔に表現すると、私の問題は次のとおりです。

  1. ユーザーはLogout.aspxの
  2. Page_Loadイベントハンドラは、フォーム認証チケットとセッションデータをクリアしてにユーザーをリダイレクトLogout.aspxするためにそれらを取るHome.aspxからHTMLのハイパーリンクをクリックしますLogin.aspx
  3. Login.aspxのPage_Loadイベントは、要求オブジェクトのUrlReferrerプロパティをチェックして、要求がログアウトページから来たものかどうかを判断します。ただし、Logout.aspxからリダイレクトされたリクエストでは、RequestオブジェクトのUrlReferrerプロパティはHome.aspxです。

なぜですか?なぜUrlReferrer Home.aspxであり、Logout.aspxではないのですか?

+0

どのようにリダイレクトしていますか?Response.RedirectまたはServer.Transferを使用していますか? – wweicker

+0

Seanix - 私はResponse.Redirectを使用しています – pmarflee

+0

UrlReferrerはクライアントマシンの前回の要求で、Resp onse.RedirectとServer.Transferを使用すると、Server.Transferが記述した方法で失敗し、Response.Redirectが機能すると推測できました。申し訳ありませんが、私は元の質問に答えることができませんが、私はいくつかの代替ソリューションを提供することができます... – wweicker

答えて

3

説明しているシナリオは、ログアウトページが実際にフォーム認証Cookieを削除していない限り正しく動作するはずです。あなたは()Roles.DeleteCookieを呼び出すために覚えているクッキーに保存するロールマネージャを使用している場合も

//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) 

:フォーム認証セッションを終了するには、いくつかの方法があります。

編集:更新された質問に対する回答。

Response.Redirectメソッドは、クライアントが開始した要求だけにリファラーヘッダーを含める必要があるため、新しいURLリファラーでヘッダーを返しません。ここでは、参照元のヘッダーを変更しません見ることができますResponse.Redirectをコードは次のとおりです。

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 

あなたは他の方法に従うことリフレクタを使用することができますが、私は任意のヘッダを変更するものを表示されません。

+0

フォーム認証のクッキーがクリアされています。これは問題ではありません。問題は、ログインページのリクエストがログアウトページのリクエストによって行われたかどうかを判断する方法です。ユーザーがHome.aspxのリンクをクリックします。これでLogout.aspxになります。 Logout.aspxは、フォーム認証Cookieとセッションの日付をクリアし、Login.aspxにリダイレクトします。ただし、Login.aspxへの要求のUrlReferrerプロパティは、Logout.aspxではなくHome.aspxを参照します。私はLogout.aspx経由でリクエストが来たかどうかを知りたいので、SSOサーバー経由で「ソフト」ログインを行わず、代わりにユーザーに資格情報を要求します。 – pmarflee

+0

参照URLはHttpContext.Current.Request.UrlReferrerにありますが、すでにHome.aspxを表示していたとします。私がこれを想像できる唯一の方法は、あなたのログアウトリンクが実際にはasp HyperLinkコントロールであって、ログアウトページへのServer.Transfer、そしてログインページへのServer.Transferでイベントを発生させた場合です。 つまり、「ソフト」ログインが発生する唯一の方法は、フォーム認証Cookieが適切にクリアされていない場合です。 – jellomonkey

+0

ログアウトリンクは通常のハイパーリンクタグです。それに付随するコードはありません。 「ソフト」ログインが実行される方法は、実際に問題に関連するものではありません。ログアウトページは、Server.TransferではなくResponse.Redirectを実行します。 – pmarflee

1

Response.Redirect( "login.aspx?)=ログアウト」から

  • スティーブ・イエーツ
  • のITS社
  • なぜターザンはひげを持っていない

〜Taglinatorによってキャッチフレーズ:?www.srtware.com〜

関連する問題