【问题标题】:Forms Authentication Ignoring Default Document忽略默认文档的表单身份验证
【发布时间】:2011-04-19 00:07:38
【问题描述】:

我花了一天半的时间试图解决这个问题。基本上有一个 ASP.net 网站,在 IIS7 上使用 Framework 4.0 进行表单身份验证。

除了在没有指定文档的情况下点击它(应该解析为默认文档)之外,授权的东西似乎在每种情况下都能完美运行。

例如(请不要在现场苛刻,它仍在开发中;)), http://www.rewardroster.com/Default.aspx 完美运行,此页面应允许 web.config 中指定的匿名访问。

但如果我直接点击 www.rewardroster.com,它会重定向到登录页面,返回 URL 设置为“/”或 Login.aspx?ReturnUrl=%2f

我尝试过的一些事情:

1) 将身份验证设置为无,然后默认文档工作,所以这不是问题。

2) 在 Web.config 中添加 DefaultDocument 属性

3) 删除了 IIS 默认文档列表中除 Default.aspx 之外的所有条目

4) 在 Config 中添加 MachineKey 条目

5) 在 IIS 中从集成管道切换到经典管道

这是我的配置中的内容:

  <authentication mode="Forms">
    <forms name="appNameAuth" loginUrl="Login.aspx" protection="All" timeout="60" slidingExpiration="true" defaultUrl="Default.aspx" path="/">
    </forms>
  </authentication>
  </authentication>

 <location path="Default.aspx">

非常感谢您抽出宝贵时间,希望有人知道这里发生了什么。

【问题讨论】:

  • 我对 donet v4 也有同样的问题,有谁知道为什么在 v2.0、v3 和 v3.5 多年来一直很好的情况下突然开始出现这种情况?

标签: asp.net iis-7 forms-authentication


【解决方案1】:

我遇到了同样的问题并以这种方式解决:

在我添加的 Dmitry.Alk 解决方案旁边的 Global.asax 中:

    if (Request.AppRelativeCurrentExecutionFilePath.ToLower() == "~/default.aspx")
        HttpContext.Current.RewritePath("Default.aspx");
    if (Request.AppRelativeCurrentExecutionFilePath.ToLower() == "~/")
        HttpContext.Current.RewritePath("Default.aspx");
    if (Request.AppRelativeCurrentExecutionFilePath.ToLower() == "~")
        HttpContext.Current.RewritePath("Default.aspx");

【讨论】:

    【解决方案2】:

    这是我的解决方案:

    Global.asax,方法:Application_BeginRequest,放置以下内容:

    if (Request.AppRelativeCurrentExecutionFilePath == "~/")  
       HttpContext.Current.RewritePath("HomePage.aspx");
    

    既好又简单,如果您的网站基于配置变量使用多个主页,您就有机会围绕要使用的主页构建逻辑。

    Dmitry.Alk

    【讨论】:

    • 很好的答案。但将其设为“~/HomePage.aspx”。因为如果您的应用位于子文件夹 ("server/myapp/") 中,则对 "server/myapp" 的请求(没有尾部斜杠)将导致此代码崩溃。
    • 对我不起作用,在访问 .com 时仍然得到 Login.aspx?ReturnUrl=%2f
    • 改成 HttpContext.Current.RewritePath("~/Default.aspx");它奏效了。
    • 完美!非常感谢:-)
    • 我更喜欢带有 URL 映射的解决方案:stackoverflow.com/a/19154854/991267
    【解决方案3】:

    我在尝试访问根路径时遇到了同样的问题,我尝试了前面提到的所有方法。似乎 Asp.net 4.0 在 IIS 7 的 applicationhost.config 中添加了两个 ExtensionlessUrl 模块。您可以通过将以下内容添加到 web.config 来删除这些模块

    <system.webServer>
      <handlers>
        <remove name="ExtensionlessUrl-Integrated-4.0"/>
        <remove name=" ExtensionlessUrl-ISAPI-4.0_32bit "/>
      </handlers>
    </system.webServer>
    

    附加信息

    Microsoft KB

    How extensionless urls are handled by asp net v4

    【讨论】:

    • 但如果我确实需要使用不带扩展名的 URL(例如:WCF 服务),这将禁用它们,对吧?
    • 奇怪的是,它起初对我也不起作用 - 但是当我通过 IIS 管理器(来自“处理程序映射”部分)进行操作时,它起作用了,尽管这似乎只是修改了 web .config 以同样的方式。如果您在 64 位系统上运行,则还需要删除 64 位。
    【解决方案4】:

    Johan 的解决方案对我有用,但前提是请求是针对站点根目录的。

    我的网站是这样组织的:

    • www.[mysite].com/login.aspx
    • www.[mysite].com/default.aspx
    • www.[mysite].com/[somestuff]/default.aspx
    • www.[mysite].com/[morestuff]/default.aspx

    在遵循 Johan 的好建议后,对 www.[mysite].com 的请求被定向到表单登录页面,登录后进入默认页面。但是,如果有人请求“/[somestuff]/”,它仍然不起作用。

    我通过在 [somestuff] 和 [morestuff] 目录上启用匿名身份验证,然后在这些目录中的各个文件上禁用它来使其工作。这不是我想要支持的安全设置,因为人们可以从 default.aspx 获得他们要去的地方,或者只是请求 [somestuff]/default.aspx 开始。但现在我知道为什么它失败了。您似乎需要匿名访问您希望使用默认文档的目录。

    【讨论】:

      【解决方案5】:

      我今天遇到了类似的问题。我正在尝试使用集成管道来保护非 asp.net 资源(静态文件、php 等)。

      我的根 web.config 中有一条规则,然后我允许根据具体情况访问特定资源。

      这可行,只是对“/”的请求永远无法通过身份验证(无休止地重定向到登录页面),而对“/Default.aspx”的请求很好。

      我的问题是因为所有资源类型都启用了 Asp.Net UrlAuthentication 模块,显然这不适用于我的场景。相反,我不得不将该模块更改为仅适用于托管资源并安装 IIS7 的非托管 url 身份验证。然后我必须对其进行配置(因为它使用不同的身份验证设置),并确保为非托管资源启用了 RoleManager(因为我正在对角色进行身份验证)。此 URL 可能会有所帮助:http://learn.iis.net/page.aspx/142/understanding-iis-70-url-authorization/

      【讨论】:

        【解决方案6】:

        我最终解决此问题的方法是在我的登录页面中编写几行代码来检查“/”的 Request.QueryString["ReturnUrl"]。如果它找到了,那么它会重定向到 default.aspx。

        我找不到任何方法来使表单身份验证不拦截没有指定页面的调用(例如 www.mysite.com)。 :( 我什至尝试过 .NET 4 URL Routing,但这也没有阻止 Forms Authentication 劫持请求。

        下面是我在 login.aspx 中使用的代码:

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!(IsPostBack || IsAsync))
            {
                string returnUrl = Request.QueryString["ReturnUrl"];
                if (returnUrl != null)
                    if (returnUrl == "/")
                        Response.Redirect("default.aspx");
            }
        }
        

        【讨论】:

        • 尝试了许多其他解决方案。这是唯一对我有用的东西。
        【解决方案7】:

        我遇到了类似的问题。未登录时没有样式,www.site.nl\ 重定向到登录页面(带有重定向 url 到主页)并输入 www.site.nl\Home(与提到的重定向 url 相同的主页之前)不需要登录。

        解决方案是:

        • 打开 IIS
        • 打开 IIS:身份验证
        • 打开和编辑匿名访问
        • 检查用户(我把用户改成了app.pool用户)
        • 授予用户对站点根目录(在文件系统上)的权限

        这对我有用。

        祝你好运

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-22
          • 2012-03-15
          • 1970-01-01
          • 2014-07-13
          • 1970-01-01
          相关资源
          最近更新 更多