当有多个重定向时,如何在ASP.NET中获取引用URL?

时间:2009-04-28 16:58:59

标签: asp.net forms-authentication single-sign-on

我正在开发一个使用内部SSO服务器进行身份验证的Web应用程序。我的主页上有一个名为Logout.aspx的链接。 Logout.aspx清除表单身份验证cookie,所有会话数据,然后执行重定向到窗体身份验证配置中指定的LoginUrl,该配置当前设置为名为Login.aspx的页面。

但是,当加载Login.aspx时,会尝试使用先前发出的SSO身份验证票证隐式地重新验证用户对SSO服务器的身份。如果此票证仍然存在,则先前的用户将重新登录并发送回主页。我想确定,当加载登录页面时,请求是否来自Logout页面。请求的UrlReferrer属性仍引用Home.aspx,大概是因为这是客户端请求的最后一个url。

目前我有一个解决方法,我从登出页面向请求附加一个查询字符串变量,指示登录页面不执行隐式登录,而是提示用户输入凭据。如何以编程方式确定请求是否来自“注销”页面的重定向?

编辑29/04/2009:

在与jellomonkey交谈之后,我应该指出SSO服务器与消费网站的本地表单身份验证之间的交互与手头的问题没有直接关系。简洁地说,我的问题是:

  1. 用户点击Home.aspx中的HTML超链接,将其带到Logout.aspx
  2. Logout.aspx的Page_Load事件处理程序清除表单身份验证票证和会话数据,并将用户重定向到Login.aspx
  3. Login.aspx的Page_Load事件检查Request对象的UrlReferrer属性,以确定是否通过Logout页面发出请求。但是,在通过Logout.aspx重定向发出的请求中,Request对象的UrlReferrer属性为Home.aspx。
  4. 这是为什么?为什么UrlReferrer Home.aspx而不是Logout.aspx?

2 个答案:

答案 0 :(得分:3)

除非注销页面实际上没有删除表单身份验证cookie,否则您描述的方案应该正常工作。有几种方法可以结束表单身份验证会话:

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

此外,如果您使用存储在cookie中的角色管理器,请记得调用Roles.DeleteCookie()。

编辑:回复更新后的问题。

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

您可以使用反射器来跟随其他方法,但我没有看到任何更改任何标题的方法。

答案 1 :(得分:1)

的Response.Redirect( “login.aspx的?从登出=”)

  • Steve Yates
  • ITS,Inc。
  • 泰山为什么不胡子?
Taglinator的标语:www.srtware.com~