IIS 7.5和匿名身份验证/表单身份验证可以很好地协同工作

时间:2014-03-07 17:10:16

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

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

所以dir结构如下所示:

\IIS
    \Site
        \bin
        \Content
        \Views

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

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

我们希望阻止用户在浏览器中转到/Content/Scripts/MyScript.js

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

这是否可能,因为IIS和MVC 4 auth处于完全不同的水平?如果有可能我有哪些选择?

3 个答案:

答案 0 :(得分: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中默认会阻止对该位置的任何访问。尝试一下,它应该满足你的要求,让脚本可用于捆绑,但如果有人直接浏览它,则无法访问。

答案 1 :(得分:0)

我只有一半得到了我想要的东西,但这就是我最终做的事情。我在站点级别启用了匿名身份验证,并对特定控制器使用了Forms身份验证。这就是我原来的方式,所以这里没有任何改变。

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

这是有效的,因为捆绑不会对这些文件发出http请求,而捆绑包本身也没有正常的JavaScript和CSS文件扩展名。

答案 2 :(得分:-1)

您无法在IIS级别处理此问题。您只需允许Anonymous Auth,然后将[Authorize]添加到每个控制器。然后,只有在您的主页和登录操作中添加属性[AllowAnonymous]

至于问题的第二部分,你无法阻止这一点。 MVC捆绑在一起,所以它需要实际的文件。但是,如果它们从未被引用过,那么它们就是黑洞:用户无法知道要请求的文件,所以这是一种默默无闻的安全性。