Проверка подлинности с помощью форм с добавлением дополнительной информации вместе с ReturnUrl - PullRequest
4 голосов
/ 13 октября 2010

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

Я хотел бы отправить дополнительную информацию в строке запроса, которая может варьироваться, так что не будет просто статически встраивать ее в ссылку в узле loginUrl в web.config.

Редактировать: Для пояснения я хочу перехватить запрос до его перенаправления НА страницу входа .

Пример:

<authentication mode="Forms">
      <forms loginUrl="http://the/interwebs/login.aspx" timeout="2880" 
                enableCrossAppRedirects="true" />
</authentication>

И до того, как пользователь будет перенаправлен на http://the/interwebs/login.aspx Я хотел бы иметь возможность упаковать значения запроса, чтобы URL мог выглядеть примерно как http://the/interwebs/login.aspx?Action=Refresh

Ответы [ 3 ]

6 голосов
/ 19 октября 2010

Это можно сделать, обработав событие HttpApplication.AuthenticateRequest

    private void Application_AuthenticateRequest(Object source, EventArgs e)
    {

        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;

        string cookieName = FormsAuthentication.FormsCookieName;
        HttpCookie authCookie = context.Request.Cookies[cookieName];

        if (authCookie == null || string.IsNullOrEmpty(authCookie.Value))
        {
            //... do something
        }

К вашему сведению, в настоящее время мы делаем это с помощью реализации IHttpModule.

1 голос
/ 24 октября 2010

Я делал это раньше с помощью модуля http.Мой пример (урезанный), в vb.net.Я просто проверяю код состояния 401 и делаю свое собственное перенаправление.Большая хитрость заключалась в том, что мне пришлось удалить и добавить обратно http.Modules web.config, чтобы убедиться, что мой httpmodule вышел из модуля авторизации URL.В моем случае у меня была некоторая перезапись URL для локализации, и мне нужно было отправить идентификатор локали на страницу входа в систему, поскольку он был потерян обычным перенаправлением в модуле авторизации URL.Я интенсивно использовал Reflector для создания базового пути (не показан), так как это частные методы.

    Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
        AddHandler context.EndRequest, AddressOf Context_EndRequest
    End Sub

    Private Sub Context_EndRequest(ByVal sender As Object, ByVal e As EventArgs)

        If TypeOf sender Is HttpApplication Then

            Dim hApplication As HttpApplication = DirectCast(sender, HttpApplication)
            Dim hContext As HttpContext = hApplication.Context

            If (hContext.Response.StatusCode = &H191) Then

                hContext.Response.Redirect(String.Format("{0}?ReturnUrl={1}&someparam2={2}", basepath, HttpUtility.UrlEncode(hContext.Request.RawUrl), someparam2))

            End If

        End If

    End Sub

web.config changes

  <httpModules>
      <clear/>
      <!-- custom -->
      <add name="SomeHttpModule" type="SomeCompany.SomeProduct.SomeHttpModule"/>
      <!-- add back defaults, exlude PassportAuthentication, AnonymousIdentification, Profile -->
      <add name="OutputCache" type="System.Web.Caching.OutputCacheModule"/>
      <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
      <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule"/>
      <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/>
      <add name="RoleManager" type="System.Web.Security.RoleManagerModule"/>
      <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule"/>
      <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule"/>
  </httpModules>
0 голосов
/ 13 октября 2010

Вам не нужно использовать механизм проверки подлинности с помощью форм для перенаправления пользователей на URL-адрес.Вы можете сделать это в коде.Просто подпишите их в и перенаправьте их самостоятельно, используя Response.Redirect.

...