0

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

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

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

2009 年 4 月 29 日编辑:

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

  1. 用户单击 Home.aspx 中的 HTML 超链接,这会将他们带到 Logout.aspx
  2. Logout.aspx 的 Page_Load 事件处理程序清除 Forms Authentication 票证和 Session 数据并将用户重定向到 Login.aspx
  3. Login.aspx 的 Page_Load 事件检查 Request 对象的 UrlReferrer 属性以确定请求是否来自 Logout 页面。但是,在通过从 Logout.aspx 重定向而来的请求中,Request 对象的 UrlReferrer 属性是 Home.aspx。

为什么是这样?为什么是 UrlReferrer Home.aspx 而不是 Logout.aspx?

4

2 回答 2

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

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

于 2009-04-28T21:19:52.527 回答
1

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

  • 史蒂夫·耶茨
  • 它的公司
  • 为什么泰山没有胡子?

~ Taglinator 的标语:www.srtware.com ~

于 2009-06-17T18:20:46.337 回答