【问题标题】:IIS 7.5 and making anonymous authentication/forms authentication play nicely togetherIIS 7.5 和匿名身份验证/表单身份验证很好地结合在一起
【发布时间】:2014-03-07 17:10:16
【问题描述】:

我有一个在 IIS 网站的站点级别下运行的 ASP.NET MVC 4 应用程序。

所以目录结构是这样的:

\IIS
    \Site
        \bin
        \Content
        \Views

MVC 4 应用通过用户名和密码使用表单身份验证,但我需要锁定整个站点并在 IIS 级别关闭匿名身份验证。

此要求的目标是只允许用户登陆主页和登录页面。问题是如果我关闭匿名身份验证,那么用户甚至无法回家或登录。

我们希望阻止用户在浏览器中访问/Content/Scripts/MyScript.js 的另一件事。

我正在使用捆绑,所以这些文件在那里,除了我捆绑时不会被我使用。

这是否可能,因为 IIS 和 MVC 4 身份验证处于完全不同的级别?如果可能,我有哪些选择?

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-4 authentication iis


    【解决方案1】:

    Chris Pratts 的回答是正确的。您可以成功关闭匿名身份验证,让 MVC4 为您处理所有这些。

    确保您的 web.config 中有以下内容

    <modules runAllManagedModulesForAllRequests="true"></modules>
    

    在您的 system.webserver 部分中。

    您可以做的另一件事是利用 IIS 中的位置标记来防止用户访问站点的不同部分。

    例如,你可以把它放在你的 web.config 中

      <location>
        <system.web>
          <authorization>
            <deny users="?" />
          </authorization>
         </system.web>
      </location>
    

    这确保只有经过身份验证的用户才能访问该站点。然后,您可以进一步细化它。

      <location path="External">
        <system.web>
          <authorization>
            <allow users="*" />
          </authorization>
        </system.web>
       </location>
    

    基本上,现在所有用户都可以向 /External 发出任何请求(无论身份验证如何)。您可能希望将需要未经身份验证的用户访问的所有脚本放在这里。

    如果有一个您不希望任何人访问的特定目录,您可以执行类似的操作

          <location path="/Content/Scripts">
            <system.web>
              <authorization>
                <deny users="*" />
              </authorization>
            </system.web>
           </location>
    

    现在,默认情况下,IIS 将阻止对该位置的任何访问。试一试,它应该可以满足您的要求,让脚本可用于捆绑,但如果有人直接浏览它,则无法访问。

    【讨论】:

    • 感谢您的详细解答。我走了一个不同的方向,但我感谢你的帮助。
    • 没问题。请求过滤是解决此问题的一种有趣方式。
    【解决方案2】:

    我只得到了我想要的一半,但这就是我最终要做的。我在站点级别启用了匿名身份验证,并为特定控制器使用了表单身份验证。这就是我最初拥有它的方式,所以这里没有任何改变。

    由于我使用的是捆绑包,因此用户永远不需要查看 .js,因此我通过文件扩展名使用 Request Filtering,因此阻止任何 .js 甚至 .css,我不想暴露。

    这是因为捆绑不会向这些文件发出 http 请求,并且捆绑本身没有正常的 JavaScript 和 CSS 文件扩展名。

    【讨论】:

      【解决方案3】:

      您不在 IIS 级别处理此问题。您只需允许匿名身份验证,然后将[Authorize] 添加到每个控制器。然后仅在您的主页和登录操作上添加属性[AllowAnonymous]

      至于您问题的第二部分,您无法真正阻止这一点。 MVC 动态捆绑,因此它需要实际的文件。但是,如果它们从未被引用,它们就是黑洞:用户将无法知道要请求什么文件,因此这是一种隐蔽的安全性。

      【讨论】:

      • 我了解它的工作原理。你的讽刺是不专业的,没有帮助。我只是想知道我所问的是否可能。我已经让 MVC 为我处理安全方面的问题。
      • 这叫做幽默。而且,在您仅仅因为您不喜欢答案而对答案投反对票之前,请实际阅读常见问题解答:“每当您遇到一个非常草率、不费吹灰之力的帖子或一个明确且可能的答案时,请使用您的投反对票危险地不正确。” (stackoverflow.com/help/privileges/vote-down) 这些条件都不能描述我的答案。我给了你可能的最佳答案,而你最终还是遵循了这个答案,即使你创建了自己的答案,而不是在这里接受我的答案或其他答案之一。
      • 我并不是有意忽略这些规则。不幸的是,除非您编辑答案,否则我无法取消我的反对票。
      • 我不在乎你是否删除它,我的代表很好,所以它不像我吓坏了或什么的。但是,我确实想传达,因为您相对较新,这是对downvoting 的不当使用,因此,我的回答确实不需要编辑即可删除。不管怎样。
      • 谢谢你指出我会出于正确的原因投反对票。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 2012-10-14
      • 2020-09-19
      • 1970-01-01
      • 2019-01-09
      相关资源
      最近更新 更多