我只想为 1 个域绑定启用基本身份验证,其余域可供公众访问。使用 IIS 可以做到这一点吗?
答案1
网站的绑定信息用于确定传入请求被路由到哪个网站。(通过 Windows 激活服务和 http.sys)。
对于每个网站,您可以为整个网站或网站内的特定 URL 启用各种身份验证方法,但不能基于主机名。
您至少有两个选择:
选项一是使用两个指向同一物理目录的独立网站并在站点根目录中使用相同的 web.config。
您仍然可以对两个站点采用不同的身份验证方法。
这里的缺点是您有两组日志文件,并且对配置的某些更改也必须进行两次。
选项二涉及URL 重写模块
假设您有两个主机名绑定到站点normal.serverfault.com
和secure.serverfault.com
。
在站点根目录下创建一个虚拟目录secure
,但将其指向站点本身的相同物理目录(与根目录相同)。
对于虚拟目录,禁用 anonymousAuthentication 并启用 basicAuthentication。
现在向网站添加重写规则:
<rewrite>
<rules>
<rule name="Secure">
<match url=".*" />
<conditions>
<add input="{SERVER_NAME}" pattern="^secure\.serverfault\.com$" />
</conditions>
<action type="Rewrite" url="/secure/{R:0}" />
</rule>
</rules>
</rewrite>
我们正在重写所有使用secure
虚拟目录的请求,但前提是主机名是secure.serverfault.com
现在,用户normal.serverfault.com
仍然可以无需身份验证访问该网站,但使用时secure.serverfault.com
必须登录。
我发现此选项的一个问题是,web.config
对于重写的请求,站点根目录中的内容基本上要处理两次。
尽管它在物理上只存在一次,但在执行请求时,\secure\
它会被视为虚拟目录的本地目录,并再次被视为父目录的本地目录。因此,您必须确保没有任何不支持此功能的设置。例如,<add...
节点不能重复,您必须使用<clear...
或<remove...
解决这个问题。或者,您可以将设置移到 ApplicationHost.config 中。
您应该用此设置测试您的网站,但由于浏览器永远不知道 URL 已被重写,所以它应该可以正常工作。