IE访问IIS7.5架设的需Windows认证的网站时出现不停弹框的问题
这是一个安装了IIS的Windows 2008系统,它已运行了一些Sharepoint站点。这些Sharepoint站点使用Windows认证,且他们都正常运行。
现在在此服务器上部署了一个新的Web站点,并启用了Windows认证(采用内核态),但当通过https://MyWebServer:8080或https://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 服务账号 |
随意 |
如何访问 |
顺带一提,若我们想用内核态认证(建议使用),并把SPN注册在应用池认证中,我们可以设置useAppPoolCredentials为true。这里有一个配置的例子。
<system.webServer>
<security>
<authentication>
<windowsAuthentication enabled="true" useKernelMode="true" useAppPoolCredentials="true" />
</authentication>
</security>
</system.webServer>
Wei Zhao from DSI team