我有一个带有表单身份验证的asp.net网站,当页面超时时,似乎遇到了重定向循环问题。
首先是我的规则:
<rewrite>
<rules>
<clear />
<rule name="HTTP to HTTPS redirect" enabled="false" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTPS}" pattern="OFF" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/" appendQueryString="true" redirectType="Permanent" />
</rule>
<rule name="Root to login page" enabled="true" stopProcessing="true">
<match url="^$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<action type="Redirect" url="https://{HTTP_HOST}/Account/Login.aspx" redirectType="Found" />
</rule>
<rule name="Login" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
<match url="*/Login.aspx" />
<conditions>
<add input="{REQUEST_URI}" pattern="*account/login.aspx" negate="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/Account/Login.aspx" />
</rule>
</rules>
</rewrite>
这里的意图是:
我已确认在第一个规则关闭后,当页面过期时,用户确实会使用正确的返回网址重定向到登录页面(https.//mysite.com/account/login.aspx?ReturnUrl=% 2fMemberPages%2fMyPage.aspx)。但是,当页面到期时,第一个urlrewrite规则打开,用户获取页面无法显示错误,地址栏中的URL为https .// mysite.com/memberpages/mypage.aspx。
我尝试调整各种设置,包括为 ReturnUrl 的第一条规则添加排除项,但我无法让它在最后期限内行动起来。任何人都可以帮我提一些建议吗?
答案 0 :(得分:0)
由于您的第一个规则重定向到url="https://{HTTP_HOST}/"
,因此您的第二个规则也应匹配尾随/
,因此您应该将其写为:
<rule name="Root to login page" enabled="true" stopProcessing="true">
<match url="^/?$" />
<action type="Redirect" url="account/login.aspx" redirectType="Found" />
</rule>
请注意,您不需要每次都重定向到完整的网址(大部分时间都可以跳过https://{HTTP_HOST}/
)。
答案 1 :(得分:0)
通过一些外包帮助(感谢Kyle),我们找到了解决这个问题的方法。事实证明我们的表单身份验证超时和会话超时设置不正确。所有需要做的就是设置:
<sessionState mode="InProc" timeout="10" />
和
<forms loginUrl="~/Account/Login.aspx" slidingExpiration="true" timeout="5" />
根据凯尔的研究,你必须使用以下公式:
会话状态超时&lt; =(表单身份验证超时* 2)
将会话状态超时设置为10并将表单超时设置为5(显然是测试值)后问题似乎消失了。