表单身份验证添加其他信息以及ReturnUrl

时间:2010-10-12 22:15:38

标签: c# asp.net .net-4.0 forms-authentication

当应用需要重定向到登录页面时,使用表单身份验证是否有一个事件或任何可扩展点,可以让我在重定向到登录页面之前对请求执行其他工作?

我想在查询字符串中发送可能有所不同的其他信息,以便在web.config中的loginUrl节点的链接中静态嵌入该信息。

修改:为了便于说明,我想在重定向登录页面之前截取请求。

示例:

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

在将用户重定向到http://the/interwebs/login.aspx之前,我希望能够打包查询值,以便网址最终可能会显示http://the/interwebs/login.aspx?Action=Refresh

3 个答案:

答案 0 :(得分:6)

您可以通过处理事件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 :(得分:1)

我以前用http模块做过这个。我的例子(剥离),在vb.net中。我只是检查401状态代码并进行自己的重定向。这里的一个大技巧是我必须删除并添加回web.config httpModules以确保我的httpmodule从url授权模块进入。在我的情况下,我有一些url重写本地化,我需要将区域设置ID发送到登录页面,因为它被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更改

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

答案 2 :(得分:-1)

您不必使用Forms身份验证的机制将人员重定向到URL。你可以在代码中做到这一点。只需sign them in并使用Response.Redirect自行重定向。