我有一个 IIS 应用程序和三个子应用程序如下:
CMT (Windows and Anonymously authenticated)
- CI
- EM
- Website (Windows authenticated)
CI 和 EM 是辅助 Web 服务,而 Website 显然是网站。现在,如果应用程序托管在 cmt.mycompany.com 下,则用户可以按如下方式访问该网站:
cmt.mycompany.com/website/mypage
我想编写一个 URL 重写规则,以便我们的用户不必在 DNS 后写“网站”,而可以简单地打开cmt.mycompany.com
或cmt.mycompany.com/mypage
分别打开主页或我的页面。
<rule name="WebsiteMapping" stopProcessing="true">
<match url="^(?!\b(?:ci|em|website)\b).*$" />
<action type="Rewrite" url="http://{HTTP_HOST}/website/{R:0}" logRewrittenUrl="true" />
</rule>
此规则的作用只是重写任何不以ci
、em
或 开头的 URL,并在 DNS 后添加website
。website
我遇到了两个似乎无法解决的问题:
由于某种原因,URL Rewrite 似乎无法与身份验证配合使用,因此每当我点击 时
cmt.mycompany.com
,都会出现一个对话框,要求我进行身份验证,即使我输入了凭据,它也无法正常工作。由于主应用程序 (CMT) 和网站托管在不同的应用程序池下,我们需要安装 IIS ARR,但这没有帮助。我尝试将规则更改为“重定向”,它确实有效,但还有另一个问题。因此,我有一个连接到 4 个独立盒子的负载均衡器。负载均衡器托管在端口 80 下,但独立盒子托管在端口 9991 下。当我点击独立盒子时,URL 重定向成功运行,但当我点击负载均衡器 DNS 时,端口 9991(独立盒子的端口)会附加到负载均衡器 DNS!!例如,如果我点击
cmt.mycompany.com/mypage
,我会被重定向到,cmt.mycompany.com:9991/website/mypage
这显然是无效的,因为负载均衡器托管在端口号 80 上,而不是 9991。
有什么想法可以帮助我解决这些问题吗?
谢谢!
答案1
我可以看到两种可能性,NTLM 不支持 URL 重写 + ARR。对于 Windows 集成身份验证,您可能必须配置 Kerberos 才能使其正常工作。
以下页面描述了 SharePoint 的一般步骤,但它也适用于其他地方:http://blogs.msdn.com/b/echarran/archive/2010/02/11/howto-configure-sharepoint-2010-for-kerberos.aspx
从本文的深入研究来看,您必须为 Web 应用程序创建服务主体名称并将控制权委托给 Web 应用程序标识。要创建 SPN,请使用如下命令:(HTTP 适用于 HTTP 和 HTTPS)
setspn -s HTTP/[domain name of application] [domain name]\[server name hosting application]
为您需要验证的每个域和托管应用程序的每个服务器设置一个 SPN(如果您有 Web 场)。接下来,打开活动目录并将视图设置为高级模式。打开其中一个 Web 服务器的计算机对象。转到委派选项卡。将单选按钮更改为“仅信任此用户委派指定服务”,确保下一个单选按钮是“使用任何身份验证协议”。单击添加。搜索应用程序池标识(如果是网络服务,则不必担心这部分)。单击确定。在添加服务时,选择此应用程序池标识负责的所有服务,然后单击确定。
或者,可能更简单的方法是在根目录上创建一个默认页面,将流量重定向到正确的位置,如下所示:
Response.Redirect("http://" + Request.Url.ServerName + "/WebSite" + Request.Url.PathAndQuery);
在默认网站上设置自定义错误以使用此页面。我会做一些测试,但您可能必须为错误创建另一个页面,该页面使用引荐 URI 的 PathAndQuery 将其发送到正确的位置。