0

例子:

应用程序 = https://test2.mytest.com/MyApplication/Download.aspx

该应用程序在 web.config 中启用了表单身份验证:

<authentication mode="Forms">
  <forms loginUrl="https://test.mytest.com/Login/" name=".ASPXAUTH"/>
</authentication>
<authorization>
  <deny users="?"/>
</authorization>

访问应用程序时,它会正确重定向到登录页面:
https ://test.mytest.com/Login/?ReturnUrl=%2fMyApplication%2fDownload.aspx

但是,成功登录后会转到:
https://test.mytest.com/MyApplication/Download.aspx
而不是
https://test2.mytest.com/MyApplication/Download.aspx

它使用登录应用程序所在的子域 (test.mytest.com),而不是原始请求的子域 (test2.mytest.com)。无论如何,表单身份验证是否重定向回原始请求子域,而不是登录应用程序所在的子域?

对此的任何帮助将不胜感激。

4

1 回答 1

2

是的,这当然是可能的,但是您需要对身份验证子域和需要身份验证的子域进行更改。

需要认证的子域。
您遇到的问题是,当匿名用户尝试访问受保护的资源时,ASP.NET 表单身份验证会将他们重定向到登录页面并将原始请求的资源附加到“ReturnURL”查询字符串中,但此 ReturnURL 参数是相对 URL .

因此,要使其以您想要的方式工作,您需要操纵 ReturnURL 参数以某种方式指示返回到不同的站点。

一种方法是使用 HttpHandler 操作 ReturnURL 以连接到 PostAuthenticateRequest,如本文中详细介绍的使用绝对返回 URL 的表单身份验证

验证子域
要启用到调用子域的重定向,您需要在 web.config 的表单部分中将enableCrossAppRedirects属性设置为“true”,以允许重定向到另一个 Web 应用程序中的 URL。请注意这一点的含义,因为它使您容易受到开放重定向攻击

直接在 ReturnURL 上设置子域地址(有助于防止开放重定向攻击)的另一种更安全的方法是修改 ReturnURL 以在查询字符串中包含已知参数,然后修改 global.asax.cs 中的 Application_EndRequest此处此处提到的身份验证子域以重写 Response.RedirectLocation。

于 2013-03-28T15:44:09.260 回答