IE访问IIS7.5架设的需Windows认证的网站时出现不停弹框的问题

这是一个安装了IIS的Windows 2008系统,它已运行了一些Sharepoint站点。这些Sharepoint站点使用Windows认证,且他们都正常运行。

现在在此服务器上部署了一个新的Web站点,并启用了Windows认证(采用内核态),但当通过https://MyWebServer:8080https://MyWebServer.MyDomain.com:8080访问此站点时,IE会不停地请求认证。

首先,我们用域认证信息(domain credentials)测试了基本认证(basic authentication),它是成功的。然后我们启用了登陆事件的审查(audit)功能;不幸的是,不管是否成功进入了Web站点,我们都没能发现任何登陆事件的记录。

为了找出与此有关的更多信息,我们启用了IIS FREB跟踪功能,发现“IIS Web Core”设置了401状态,其错误信息是“拒绝访问”。

现在,我们不得不回来看看对Kerberos纠错最有用的信息——网络监视跟踪记录。从捕获的信息来看,我们确认了Kerberos错误是KRB_AP_ERR_MODIFIED

有两个引发该错误的常见原因:

1. 错误的DNS设定

2. 客户端发送的ticket被用不同的密钥加密/解密。

我们用netmon确认了DNS的运行在意料之中。我们用Ldp工具审查SPN,当查询SPN时得到了如下的结果

Dn: CN=MyWebServer,……..

……

servicePrincipalName (11):

….

HOST/MyWebServer.MyDomain.com ;

HOST/MyWebServer ;

….

Dn: CN=SPS_Service_Account…….

….

servicePrincipalName (18):

……

HTTP/ MyWebServer.MyDomain.com;

HTTP/ MyWebServer ;

……

我们能看到,HTTP/MyWebServer是SharePoint服务里注册的账号(被用来运行SharePoint应用池),运行在内核态认证的IIS 7以上服务器是不需要它的。然后回IIS MMC查看,我们发现所有SPS站点都采用用户态的Windows认证,它需要把SPN账号注册到应用池认证中。这就是SPS站点以Windows认证的方式运行的原因。

新添加的站点使用用户态Windows认证,需要在机器账号中注册的SPN的账号。这与SharePoint站点产生了冲突。

这解释了为何我们得到了KRB_AP_ERR_MODIFIED错误。当IE访问https://MyWebServer:8080时,请求HTTP/MyWebServer的ticket,它被注册在SharePoint服务的账号里。IE把该ticket传递给Web服务器。在服务器端,IIS尝试使用机器账号对该ticket解密。这必然会失败,因为它被另一个密钥解密。

为了解决此问题:

1. 我们给新添加的站点,如MySite,使用host头,将其加到站点绑定中。

2.注册SPN HTTP/MySite的本机账号

3.现在,我们使用https://MySite访问此Web站点。

随后,我们做以下SPN的配置:

MyWebServer:

HTTP/MySite

HTTP/MySite.MyDomain.com

HOST/ MyWebServer

HOST/ MyWebServer.MyDomain.com

SPS service account:

HTTP/ MyWebServer

HTTP/ MyWebServer. MyDomain.com

如下配置IIS:

SPS 站点

MySite

SPN

HTTP/MyWebServer

注册在SPS服务账号中

HTTP/MySite

注册在机器账号MyWebServer中

绑定

所有可用的IP

无主机名

所有可用的IP

主机名: MySite

Windows

认证

用户态

内核态

应用池认证

SPS 服务账号

随意

如何访问

https://MyWebServer

https://MySite

顺带一提,若我们想用内核态认证(建议使用),并把SPN注册在应用池认证中,我们可以设置useAppPoolCredentials为true。这里有一个配置的例子。

<system.webServer>

<security>

<authentication>

<windowsAuthentication enabled="true" useKernelMode="true" useAppPoolCredentials="true" />

</authentication>

</security>

</system.webServer>

Wei Zhao from DSI team