【问题标题】:asp.net forms authentication urlrewrite http to https causes redirect loop on page timeoutasp.net 表单身份验证 urlrewrite http 到 https 导致页面超时重定向循环
【发布时间】:2013-05-25 00:32:00
【问题描述】:

我有一个带有表单身份验证的 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>

这里的意图是:

  1. 如果有人浏览到 http.//mysite.com,他们会被重定向到 https.//mysite.com
  2. 如果有人浏览到 https.//mysite.com/,他们会被重定向到 https.//mysite.com/account/login.aspx
  3. 如果有人在我网站的任何文件夹或子文件夹中请求 login.aspx 页面,他们会被重定向到 https.//mysite.com/account/login.aspx

我已经确认关闭第一条规则后,当页面过期时,用户会被重定向到具有正确返回 URL 的登录页面 (https.//mysite.com/account/login.aspx?ReturnUrl=% 2fMemberPages%2fMyPage.aspx)。但是当页面过期时打开第一个urlrewrite规则,用户得到一个页面无法显示的错误,地址栏中的url是https.//mysite.com/memberpages/mypage.aspx。

我尝试调整各种设置,包括为 ReturnUrl 的第一条规则添加排除项,但我无法让它正常运行,而且我在截止日期前。谁能帮我提些建议?

【问题讨论】:

  • 请注意,“HTTP 到 HTTPS 重定向规则在我上面的规则中被禁用,当它启用时我遇到了问题

标签: asp.net url-rewriting forms-authentication


【解决方案1】:

借助一些外包帮助(感谢 Kyle),我们找到了解决此问题的方法。原来我们的表单身份验证超时和会话超时设置错误。所有需要做的就是设置:

<sessionState mode="InProc" timeout="10" />

<forms loginUrl="~/Account/Login.aspx" slidingExpiration="true" timeout="5" />

根据 Kyle 的研究,您必须使用以下公式:

会话状态超时

在将会话状态超时设置为 10 并将表单超时设置为 5(显然是测试值)后,问题似乎已经消失了。

【讨论】:

    【解决方案2】:

    由于您的第一条规则重定向到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}/)。

    【讨论】:

    • 尝试将匹配 url 更改为 ^/?$ 仍然得到相同的结果
    • 这很奇怪......你可以尝试使用其他浏览器吗?可以试试failed request tracing tool吗?
    猜你喜欢
    • 2011-09-15
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2013-04-07
    • 1970-01-01
    相关资源
    最近更新 更多