如何允许IIS 7.5上的匿名访问网站?

Ian*_*oyd 5 iis iis-7.5 iis-express

tl;博士:为什么

<allow users="?">
Run Code Online (Sandbox Code Playgroud)

在IIS Express上工作,但在IIS上却没有?

背景

我有一个新的asp.net web-forms项目.在Windows 7 IIS Express上本地运行时,我可以通过向web.config 添加拒绝规则来阻止"所有用户"访问该站点:*

web.config中

<configuration>
   <system.web>
      <authorization>
         <deny users="*" />
      </authorization>
   </system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)

这导致我被拒绝访问:

在此输入图像描述

这是有道理的.

我可以拒绝匿名用户访问

我是web.config,我可以使用标记而不是all()标记来阻止对匿名用户的访问:?*

      <authorization>
         <deny users="?" />
      </authorization>
Run Code Online (Sandbox Code Playgroud)

因为我没有通过身份验证,我将再次被401未经授权:

在此输入图像描述

这是有道理的.

允许匿名

通过将denyweb.config 更改为allow:我可以允许匿名访问:

<authorization>
  <allow users="?" />
</authorization>
Run Code Online (Sandbox Code Playgroud)

现在我被带到了主页:

在此输入图像描述

这是有道理的.

但是在IIS上不起作用

以上适用于IIS Express.但是,当我发布到Windows Server 2012 R2 IIS 7.5时,尝试allow匿名(?)用户不起作用:

在此输入图像描述

这是没有意义的:

  • 适用于IIS Express
  • 在IIS 7.5上失败

尝试允许每个人

而不是:

  • 只允许匿名用户(?)
  • 我可以尝试允许所有用户(*)

我再次更改web.config以允许everyone(*):

<authorization>
  <allow users="*" />
</authorization>
Run Code Online (Sandbox Code Playgroud)

在本地我仍然可以访问该网站:

在此输入图像描述

但是一旦我发布到IIS 7.5,它仍然会失败:

在此输入图像描述

这是怎么回事?

我没有做错任何事.那么我需要改变什么呢?

最初我创建了一个空的网站,并开始添加内容.后来,我需要创建真正的网站(显示信息的页面和点击按钮),所以我重新开始使用一个空的Web窗体网站.

我的感觉是Owin打破了一切.

然而,发生了什么?

我找到了.有一些关于网站的设置不适用于网站.也就是说,有关于无法配置的网站的配置选项web.config,或者网站文件夹中的任何其他文件.特别是:

在此输入图像描述

我不知道IIS存储使用匿名身份验证的位置.但是,如果没有匿名身份验证,IIS无法识别匿名用户是匿名用户.

启用匿名身份验证:

在此输入图像描述

导致IIS意识到匿名用户是匿名的.

这解释了:

  • 为什么它适用于IIS Expres
  • 为什么它在IIS 7.5上不起作用
  • 当两个网站都具有完全相同的配置文件集时,为什么它仍然不起作用

它没有解释为什么在未启用匿名身份验证时,IIS不会将匿名用户视为匿名用户; 但那是另一天的另一个问题.如果你已经读到这里,你可以复制粘贴我刚刚说的所有内容,并获得接受.否则我将不得不等待两天才能自己回答.你最好得到代表.

Lex*_* Li 6

你通过寻找解决方案来学习一些东西 祝贺.

授权发生授权.因此,在IIS上,您在处理授权规则之前看到了401.2错误页面.只有在将正确的身份验证方法设置为启用后,才会开始解决问题.

如果禁用所有身份验证方法,IIS Express应该为您提供相同的401.2错误页面.只是一张纸条.


一个微软模式和实践的文章详细解释了为何需要以允许匿名用户启用匿名身份验证:

ASP.NET身份验证分为两步.第一,

  • Internet信息服务(IIS)对用户进行身份验证,并创建Windows令牌以表示用户.
  • 如果IIS配置为使用匿名身份验证,则会生成IUSR_MACHINE帐户的令牌并用于表示匿名用户.

然后,IIS将令牌传递给ASP.NET.

注意 由于表单身份验证不依赖于IIS身份验证,因此如果要在ASP.NET应用程序中使用表单身份验证,则应在IIS中为应用程序配置匿名访问

在IIS中,为使用表单身份验证的所有应用程序启用匿名访问.

IIS允许该请求,因为IIS元数据库中启用了匿名访问.ASP.NET确认授权元素包含标记.

在向IIS发出请求时,有两种方法可以对用户进行身份验证:

  • IIS对您的身份进行身份验证(使用Basic,Digest或Windows身份验证)
  • IIS配置为允许"匿名"身份验证,并且Web站点将自行处理身份验证

这里令人困惑的部分是:

  • 就IIS而言是匿名的
  • 匿名到目前为止是ASP.net Forms身份验证

从IIS的角度来看,任何使用Forms(或Owin或任何其他自定义身份验证模块)进行身份验证的请求仍然是匿名请求:

| IIS Authentication | Application Authentication |
|--------------------|----------------------------|
| Basic              |                            |
| Digest             |                            |
| Windows            |                            |
| Anonymous          | Forms                      |
| Anonymous          | Owin                       |
| Anonymous          | BasicAuthModule            |
Run Code Online (Sandbox Code Playgroud)

当我试图允许匿名用户访问时:

<allow users="?" />
Run Code Online (Sandbox Code Playgroud)

这是一个Forms身份验证指令.但是,为了甚至达到表单身份验证,您必须允许IIS级别的匿名身份验证.