tl; dr :为什么
<allow users="?">
在IIS Express上工作,但不在IIS上工作吗?
我有一个新的asp.net web-forms项目。在Windows 7 IIS Express上本地运行时,我可以通过向web.config添加拒绝*
规则来阻止“所有用户”访问该网站:< / p>
的web.config
<configuration>
<system.web>
<authorization>
<deny users="*" />
</authorization>
</system.web>
</configuration>
这导致我被拒绝访问:
这样才有意义。
我是web.config,我可以使用?
标记阻止访问匿名用户,而不是所有({{1} })marker:
*
因为我没有通过身份验证,我将再次 <authorization>
<deny users="?" />
</authorization>
未经授权:
这是有道理的。
我可以通过将web.config中的401
更改为deny
来允许匿名访问:
allow
现在我被带到了主页:
这是有道理的。
以上适用于IIS Express。但是,当我发布到Windows Server 2012 R2 IIS 7.5时,尝试<authorization>
<allow users="?" />
</authorization>
匿名(allow
)用户不起作用:
这没有任何意义:
而不是:
?
)?
)我再次更改web.config以允许所有人(*
):
*
在本地我可以仍然访问该网站:
但是一旦我发布到IIS 7.5,它仍然会失败:
我没有做错任何事。那么我需要改变什么?
最初我创建了一个空的网站,并开始向它添加内容。后来,我需要创建真正的网站(显示信息的页面和点击按钮),所以我重新开始使用空Web窗体网站。
我的感觉是Owin打破了一切。
然而,发生了什么?
我找到了。有一些关于网站的设置不适用于网站。也就是说,有关于无法通过<authorization>
<allow users="*" />
</authorization>
或网站文件夹中的任何其他文件配置的网站的配置选项。特别是:
我不知道IIS存储使用匿名身份验证的位置。但是,如果没有匿名身份验证,IIS无法识别匿名用户是匿名用户。
启用匿名身份验证:
导致IIS意识到匿名用户是匿名的。
这解释了:
它没有解释为什么IIS在未启用匿名身份验证时不会将匿名用户视为匿名用户;但那是另一天的另一个问题。如果你已经读到这里,你可以复制粘贴我刚刚说的所有内容,并获得接受。否则我将不得不等待两天才能自己回答。你最好得到代表。
答案 0 :(得分:6)
您通过寻找解决方案来学习一些东西。祝贺。
授权在身份验证后发生。因此,在IIS上,您在处理授权规则之前看到了401.2错误页面。只有在将正确的身份验证方法设置为启用后,才会开始解决问题。
如果禁用所有身份验证方法,IIS Express应该会为您提供相同的401.2错误页面。只是一张便条。
Microsoft Patterns and Practices article详细说明了为什么您需要启用匿名身份验证才能允许匿名用户:
ASP.NET身份验证分为两步。首先,
- Internet信息服务(IIS)对用户进行身份验证,并创建Windows令牌以表示用户。
- 如果IIS配置为使用匿名身份验证,则会生成IUSR_MACHINE帐户的令牌并用于表示匿名用户。
IIS-然后将令牌传递给ASP.NET。
注意由于表单身份验证不依赖于IIS身份验证,因此如果要在ASP.NET应用程序中使用表单身份验证,则应在IIS中为应用程序配置匿名访问
在IIS中,为使用表单身份验证的所有应用程序启用匿名访问。
IIS允许该请求,因为IIS元数据库中启用了匿名访问。 ASP.NET确认授权元素包含标记。
向IIS发出请求时,有两种方法可以对用户进行身份验证:
这里令人困惑的部分是:
之间存在差异从IIS的角度来看,任何使用表单(或Owin或任何其他自定义身份验证模块)进行身份验证的请求仍然是匿名请求:
| IIS Authentication | Application Authentication |
|--------------------|----------------------------|
| Basic | |
| Digest | |
| Windows | |
| Anonymous | Forms |
| Anonymous | Owin |
| Anonymous | BasicAuthModule |
当我尝试允许匿名用户访问时:
<allow users="?" />
这是 Forms 身份验证指令。但是,为了甚至达到表单身份验证,您必须在IIS级别允许匿名身份验证。