示例:
申请= 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)。 反正是否有表单身份验证重定向回原始请求子域而不是登录应用程序所在的子域?
对此的任何帮助将不胜感激。
答案 0 :(得分:2)
是的,这当然是可能的,但您需要对身份验证子域和需要身份验证的子域进行更改。
需要身份验证的子域。
您遇到的问题是,当匿名用户尝试访问安全资源时,ASP.NET表单身份验证会将其重定向到登录页面,并将原始请求的资源附加到“ReturnURL”查询字符串中,但此ReturnURL参数为相对网址。
因此,要以您希望的方式使其工作,您需要操纵ReturnURL参数以某种方式指示返回到不同的站点。
执行此操作的一种方法是使用HttpHandler操作ReturnURL以挂接到PostAuthenticateRequest,如本文Forms Authentication With Absolute Return URLs中所述。
验证子域
要启用重定向到调用子域,您需要在web.config的forms部分中将enableCrossAppRedirects属性设置为“true”,以允许重定向到另一个Web应用程序中的URL。请注意这一点的含义,因为它让您对open redirection attacks持开放态度。
直接在ReturnURL上设置子域地址(帮助防止开放重定向攻击)的另一种更安全的方法是修改ReturnURL以包含查询字符串中的已知参数,然后修改global.asax中的Application_EndRequest .cs提供了here和here的身份验证子虚拟,以重写Response.RedirectLocation。