Как получить URL реферера в ASP.NET при наличии нескольких перенаправлений? - PullRequest
0 голосов
/ 28 апреля 2009

Я разрабатываю веб-приложение, которое использует собственный SSO-сервер для аутентификации. У меня есть ссылка на моей домашней странице на страницу с именем Logout.aspx. Logout.aspx очищает куки-файл проверки подлинности с помощью всех данных сеанса, а затем выполняет перенаправление на LoginUrl, указанный в конфигурации проверки подлинности с помощью форм, которая в настоящее время настроена на страницу с именем Login.aspx.

Однако при загрузке Login.aspx делается попытка неявной повторной аутентификации пользователя на сервере SSO с использованием ранее выданного билета аутентификации SSO. Если этот билет все еще существует, предыдущий пользователь будет снова авторизован и отправлен обратно на домашнюю страницу. Я хочу определить, при загрузке страницы входа в систему, поступил ли запрос через страницу выхода из системы. Свойство UrlReferrer запроса по-прежнему ссылается на Home.aspx, предположительно потому, что это был последний URL, запрошенный клиентом.

В настоящее время у меня есть обходной путь, с помощью которого я добавляю переменную строки запроса к запросу со страницы выхода из системы, которая инструктирует страницу входа в систему не выполнять скрытый вход в систему и вместо этого запрашивать у пользователя учетные данные. Как программно определить, поступил ли запрос с помощью перенаправления со страницы выхода?

Изменить 29.04.2009:

После разговора с jellomonkey я должен отметить, что взаимодействие между сервером единого входа и проверкой подлинности локальных форм потребляющего веб-сайта не имеет прямого отношения к рассматриваемой проблеме. Выражаясь кратко, моя проблема:

  1. Пользователь нажимает гиперссылку HTML из Home.aspx, которая переводит их в Logout.aspx
  2. Обработчик события Page_Load в Logout.aspx очищает тикет проверки подлинности с помощью форм и данные сеанса и перенаправляет пользователя на Login.aspx
  3. Событие Page_Load файла Login.aspx проверяет свойство UrlReferrer объекта Request, чтобы определить, поступил ли запрос через страницу выхода. Однако в запросах, поступивших через перенаправление из Logout.aspx, свойством UrlReferrer объекта Request является Home.aspx.

Почему это? Почему UrlReferrer Home.aspx, а не Logout.aspx?

Ответы [ 2 ]

3 голосов
/ 29 апреля 2009

Сценарий, который вы описываете, должен работать правильно, если только страница выхода не удаляет 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 голос
/ 17 июня 2009

Response.Redirect ( "login.aspx? Из = выход из системы")

  • Стив Йейтс
  • ITS, Inc.
  • Почему у Тарзана нет бороды?

~ Слоганы от Taglinator: www.srtware.com ~

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...