如何配置 Internet Information Services 上承载的 Web 应用程序时使用的 Spn

摘要

本文介绍了服务主体名称 (Spn)。本文还介绍如何配置 Microsoft Internet Information Services (IIS) 上承载的 Web 应用程序时使用的 Spn。本文还介绍了在 Windows 集成身份验证程序的协商进程。协商安全标头可让客户端选择之间 Kerberos 身份验证和 NTLM 身份验证。此外,本文还介绍了需要 SPN 启用 Kerberos 身份验证的常见方案。 最后一节描述了 Kerberos 身份验证可能会失败的情况。最后一节还提供了排除故障的步骤。

简介

重要:本文中讨论的主题应用到 Internet Information Services (IIS) 6.0。 如果设置为false的配置设置useKernelMode禁用了内核模式身份验证,主题也适用于 IIS 7.0 和 7.5。本分步指南介绍如何配置 IIS 上承载的 Web 应用程序时使用服务主体名称 (Spn)。使用 Windows 集成身份验证客户端请求进行身份验证时,IIS 将通过协商安全标头。协商安全标头可让客户端选择之间 Kerberos 身份验证和 NTLM 身份验证。协商进程选择 Kerberos 身份验证,除非满足以下条件之一为真:

  • 在身份验证中所涉及的系统之一无法使用 Kerberos 身份验证。

  • 调用应用程序不提供足够的信息来使用 Kerberos 身份验证。

若要启用选择的网络身份验证的 Kerberos 协议的协商过程,客户端应用程序必须提供 SPN、 用户主体名称 (UPN) 或 NetBIOS 帐户名作为目标的名称。如果客户端应用程序未提供目标名称,该协商进程无法使用 Kerberos 协议。如果协商进程无法使用 Kerberos 协议,协商进程选定 NTLM 协议。

更多信息

概念

SPN 的定义

SPN 是依据客户端唯一标识服务的实例的名称。如果在整个目录林中的计算机上安装多个服务实例,每个服务实例必须具有其自己的 SPN。如果有多个客户端可能会将用于身份验证的名称,一个特定的服务实例可以有多个 Spn。例如,一个 SPN 始终包含在其上运行的服务实例的宿主计算机的名称。因此,服务实例可能注册的每个名称或别名及其主机的 SPN。

HTTP 服务类

与 HTTP 协议不同 HTTP 服务类。HTTP 协议和 HTTPS 协议使用 HTTP 服务类。服务类是标识服务的一般类的字符串。知名服务类名称包括"www"为 Web 服务和目录服务"ldap"。通常情况下,该服务类名称可以是任何字符串都是唯一的服务类。请注意,SPN 语法使用正斜杠字符 (/) 分隔的元素。因此,反斜杠字符 (/) 不能出现在服务类名称。

主机服务和 HTTP 服务类

主机服务表示主机计算机。Kerberos 协议使用主机 SPN 来访问主机。Kerberos 协议只有在主机上使用的长期密钥创建服务票证。HTTP 服务类是内置服务充当主机 SPN 的别名之一。到主机计算机帐户映射主机 SPN。因此,当您使用默认 HTTP 服务类,Kerberos 协议使用计算机帐户作为服务帐户请求服务票证。

常见方案

本节描述可能需要 SPN 的方案。此外,这一节演示如何确定哪个 SPN 设置的每个方案。在这些方案中使用以下术语:

IIS6server1

运行 IIS 的计算机的主机名

mydomain

IIS6server1 计算机已加入域

appPool1

应用程序池标识用 mydomain 域中的用户帐户

appPool2

用于第二个应用程序池标识 mydomain 域中的用户帐户

www.test.com

第一个主机标头网站

www.test2.com

第二个 Web 站点的主机头

www.test3.com

第三个 Web 站点的主机头

www.myIIScluster.com

群集中运行 IIS 的计算机的完全限定的域名

www.myEXCHcluster.com

在 IIS 运行 Microsoft Exchange 的计算机群集的完全限定的域名

Setspn.exe 工具

Setspn.exe 工具可以读取、 修改和删除 Active Directory 服务帐户的 SPN 目录属性。Spn 用于定位目标主体名称运行服务的。SetSpn.exe 还工具使您能够查看当前的 Spn,重置该帐户的默认 Spn,以及添加或删除附加 SPNs.To 获得 Setspn.exe 工具的 Microsoft Windows Server 2003,请单击下面的文章编号,以查看在文章Microsoft 知识库文章:

对于 Windows Server 2003 的 Setspn.exe 支持工具更新

方案 1: 访问 IIS 应用程序,当应用程序池标识已被修改

当域用户帐户而不是默认的网络服务帐户下运行 IIS 应用程序时,您必须设置在域帐户下,在将 HTTP 服务的 SPN。在此方案中,您将访问 IIS 应用程序使用运行 IIS 的服务器的 NetBIOS 名称或运行 IIS 的服务器的 FQDN。若要通过使用 NetBIOS 名称访问 IIS 应用程序,使用以下命令,其中NETBIOS_NAME_OF_IIS_SERVER是运行 IIS 的服务器的 NetBIOS 名称:

Setspn – S HTTP /NETBIOS_NAME_OF_IIS_SERVER域 \ 用户名例如,命令可能会类似于下面的命令:

Setspn – S HTTP/iis6server1 mydomain\appPool1若要通过使用 FQDN 访问 IIS 应用程序,使用以下命令,其中FQDN_OF_IIS_SERVER是运行 IIS 的服务器的 FQDN:

Setspn – S HTTP /FQDN_OF_IIS_SERVER域 \ 用户名例如,命令可能会类似于下面的命令:

Setspn – S HTTP/iis6server1.mydomain.com mydomain\appPool1

方案 2: 使用主机头来访问 Web 应用程序

当您访问 Web 应用程序使用主机标头时,则必须设置在将 HTTP 服务的 SPN。Web 应用程序的默认帐户,如网络服务帐户、 本地服务帐户或本地系统帐户下运行时,您可以使用下面的命令:

Setspn – HTTP /HOST_HEADER NETBIOS_NAME_OF_IIS_SERVER在此命令中, HOST_HEADER为您键入访问该应用程序,浏览器窗口中, NETBIOS_NAME_OF_IIS_SERVER是运行 IIS 的服务器的 NetBIOS 名称的主机标题。例如,应用程序的命令可能会类似于下面的命令:

Setspn – HTTP/www.test.com iis6server1如果您运行的应用程序的域帐户,您可以使用下面的命令:

Setspn – HTTP /HOSTHEADER_OR_DNS_ALIAS域 \ 用户名在此命令中, HOSTHEADER_OR_DNS_ALIAS是主机标头或 DNS 别名用来访问 Web 应用程序。例如,应用程序的命令可能类似于以下命令之一:

  • Setspn – HTTP/www.test.com mydomain\appPool1

  • Setspn – HTTP/www.test3.com mydomain\appPool2

方案 3: 访问群集或负载平衡环境中的 IIS 应用程序

在群集环境中,或在负载平衡环境中,IIS 运行时,您可以通过使用群集名称而不是使用节点名称访问应用程序。此方案包括网络负载平衡。在群集技术节点是指一台计算机是群集的成员。要使用 Kerberos 作为身份验证协议,在此情况下,IIS 中的每个节点上的应用程序池标识必须配置为使用相同的域用户帐户。要配置每个 IIS 节点使用相同的域用户帐户,请使用下面的命令:

Setspn – HTTP /CLUSTER_NAME域 \ 用户名例如,命令可能类似于以下命令之一:

  • Setspn – HTTP/www.myIISCluster.com mydomain\appPool1

  • Setspn – HTTP/www.myEXCHCluster.com mydomain\appPool2

方案 4: 使用 SQL Server,以访问应用程序

在后端服务器上的 Spn 可能需要验证 IIS Web 应用程序是否需要对后端计算机正在运行 SQL Server 的访问。如果未正确配置所需的 Spn,Web 应用程序可能无法正常工作。如果后端计算机正在运行 SQL Server 运行在本地系统帐户,MSSQLSvc /FQDN_OF_SQL_SERVER:port端口号必须是可用的计算机名。使用下面的命令来确定正在运行 SQL Server 的计算机的 Spn:

Setspn – L SQL_SERVER_COMPUTER_NAME使用下面的命令来设置 SPN 运行 SQL Server 的计算机的名称:

Setspn – MSSQLSvc /FQDN_OF_SQLSERVER:port SQLSERVER_COMPUTER_NAME如果正在运行 SQL Server 的后端计算机正在运行的域帐户,MSSQLSvc /FQDN_OF_SQL_SERVER:port端口号必须是可用的域帐户。使用下面的命令以确定域帐户的 Spn:

Setspn – L 域 \ 用户名使用下列命令之一来设置 SPN 运行 SQL Server 的计算机的名称:

  • Setspn – MSSQLSvc /FQDN_OF_SQLSERVER:portFQDN_OF_SQLSERVER

  • Setspn – MSSQLSvc /FQDN_OF_SQLSERVER:port域 \ 用户名

SPN 帮助器脚本

可以使用以下示例脚本来 Spn 查找 IIS 应用程序。您可以使用此脚本来查找重复的 Spn。若要使用此脚本,请执行以下步骤:

  1. 单击开始,单击运行,键入记事本,然后单击确定

  2. 在记事本文件中,粘贴以下脚本:

    Dim argSPN, argUser, argComputer, spnToSearch, objCategory, strFilter, searchCategory, domainInputFunction Help()Dim strMessagestrMessage = strMessage & "Usage:" & chr(13)strMessage = strMessage & "For accurate results run this script from the IIS server or a member server in the same domain as IIS server." & chr(13)strMessage = strMessage & "Check the article's failure scenarios and make sure no duplicate SPNs exist." & chr(13)strMessage = strMessage & "cscript spnHelper.vbs /f:spn /spn:HTTP/www.test.com /user:mydomain\apppool1" & chr(13)strMessage = strMessage & "cscript spnHelper.vbs /f:spn /spn:HTTP/www.test.com /computer:iis6server1" & chr(13)strMessage = strMessage & "cscript spnHelper.vbs /f:user /user:mydomain\apppool1" & chr(13)strMessage = strMessage & "cscript spnHelper.vbs /f:computer /computer:iis6server1" & chr(13)strMessage = strMessage & "cscript spnHelper.vbs /f:duplicatespn /spn:HTTP/www.test.com" & chr(13)strMessage = strMessage & "cscript spnHelper.vbs /f:requiredspn" & chr(13)MsgBox strMessage,,"SPN Helper"WScript.QuitEnd FunctionFunction setArguments()argSPN = lcase(WScript.Arguments.Named("spn"))argUser =  lcase(WScript.Arguments.Named("user"))argComputer = lcase(WScript.Arguments.Named("computer"))searchCategory = lcase(WScript.Arguments.Named("f"))if instr(argUser,"\")>0 thendomainInput = ",DC=" & split(argUser,"\")(0)argUser = split(argUser,"\")(1)end ifEnd FunctionFunction resetValues()spnToSearch = ""objCategory = ""strFilter = ""End FunctionFunction getGCPath()Dim tempGCPath, objGC, tempGC, tempStrSet objGC = GetObject("GC:")for each tempGC in objGCtempGCPath = tempGC.ADsPathnextif tempGCPath <> "" thengetGCPath = tempGCPathelseWScript.Echo "Unable to find active directory"WScript.Quitend ifFor tempCounter=0 to UBound(split(lcase(split(getGCPath,"//")(1)),"."))If tempCounter = UBound(split(lcase(split(getGCPath,"//")(1)),".")) Then tempSeperator="" else tempSeperator = ","tempStr = tempStr & "DC=" & split(lcase(split(getGCPath,"//")(1)),".")(tempCounter) & tempSeperatorNextgetGCPath = tempGCPath & "/" & tempStrEnd FunctionFunction getSPNClass()Dim tempSPNClassIf trim(argSPN)="" Then getSPNClass = "*": Exit FunctionIf instr(argSPN,"/")=0 Then getSPNClass = "*": Exit FunctionIf instr(split(argSPN,"/")(0),"*")>0 Then getSPNClass = "*": Exit FunctiongetSPNClass = split(argSPN,"/")(0)End FunctionFunction isSPNInputValid(spnIN)isSPNInputValid = ""If instr(spnIN,"/")=0 Then Exit FunctionIf instr(spnIN,"*")>0 Then Exit FunctionisSPNInputValid = spnINEnd FunctionFunction Main()Dim paramSPNparamSPN = ""call  resetValues()call setArguments()Select Case searchCategoryCase "spn"if (argUser = "" and argComputer = "") or (argUser <> "" and argComputer <> "") then WScript.Echo "You must use /spn along with /computer or /user": WScript.Quitif argSPN = "" then argSPN = "*"spnToSearch = "(servicePrincipalName=" & argSPN & ")"if argUser <> "" then objCategory = "(objectCategory=person)(sAMAccountName=" & argUser & ")"if argComputer <> "" then objCategory = "(objectCategory=computer)(cn=" & argComputer & ")"End IfstrFilter = "(&" & spnToSearch & objCategory & ")"Case "duplicatespn"If isSPNInputValid(argSPN)="" Then WScript.Echo "Invalid SPN input. Please verify and try again.": WScript.QuitspnToSearch = "(servicePrincipalName=" & argSPN & ")"strFilter = spnToSearchparamSPN = argSPNCase "requiredspn"call showRequiredSPNs("IIS")WScript.QuitCase "computer"objCategory = "(&(objectCategory=computer)(cn=" & argComputer & "))"strFilter = objCategoryCase "user"objCategory = "(&(objectCategory=person)(sAMAccountName=" & argUser & "))"strFilter = objCategoryCase elsecall Help()WScript.QuitEnd Selectcall getSPNs(paramSPN)End FunctionFunction getPingResult(hostName,errorMessage)'On Error Resume NextgetPingResult = ""If instr(hostName,".")=0 ThenDim tempGCPath, objGC, tempGCSet objGC = GetObject("GC:")for each tempGC in objGCtempGCPath = tempGC.ADsPathnextif tempGCPath <> "" thengcPath = tempGCPathelseWScript.Echo "Unable to find active directory"WScript.Quitend ifSet adConn = CreateObject("ADODB.Connection")Set adCmd = CReateObject("ADODB.Command")adConn.Provider = "ADsDSOObject"adConn.Open "ADs Provider"Set adCmd.ActiveConnection = adConnadQuery = "<" + gcPath + ">;" & "(&(objectCategory=computer)(cn=" & hostName & "))" & ";dnsHostName;subtree"'WScript.Echo adQuery'WScript.QuitadCmd.CommandText = adQuerySet adRecordSet = adCmd.Executeif adRecordSet.RecordCount>0 Then If IsNull(adRecordSet.Fields("dnsHostName"))=0 Then getPingResult = adRecordSet.Fields("dnsHostName") hostName = getPingResult Else getPingResult = hostNameEnd Ifelse errorMessage = "Could not find " & hostname & " in the active directory"end ifExit FunctionEnd IfgetPingResult = hostNameExit Function'If Err Then getPingResult = hostNameEnd FunctionFunction getSPNs(spn)Dim spnClass, duplicateSPNArrayspnClass = getSPNClass()duplicateSPNArray = ""gcPath = getGCPath()Set adConn = CreateObject("ADODB.Connection")Set adCmd = CreateObject("ADODB.Command")adConn.Provider = "ADsDSOObject"adConn.Open "ADs Provider"Set adCmd.ActiveConnection = adConnadQuery = "<" + gcPath + domainInput + ">;" & strFilter & ";distinguishedName,objectCategory,dnsHostName,servicePrincipalName,sAMAccountName;subtree"'WScript.Echo adQuery'WScript.QuitadCmd.CommandText = adQuerySet adRecordSet = adCmd.Executeif adRecordSet.EOF and adRecordSet.Bof ThenWScript.echo "No " & searchCategory & " found with the given criteria."elseIf adRecordSet.RecordCount>10 ThenIf msgbox(adRecordSet.RecordCount & " Records are returned with the given criteria. Printing all of them might take a long time" & chr(13) & " Do you want to print all of them?",vbYesNo,"Kerberos")=vbNo Then Exit FunctionEnd IfDo While not adRecordset.EofIf Err Then Exit DoWScript.echo "Class: " & split(split(adRecordSet.Fields("objectCategory"),",")(0),"=")(1)WScript.Echo adRecordSet.Fields("distinguishedName")if UCase(adRecordSet.Fields("objectCategory")) = "COMPUTER" ThenWScript.echo "Computer Name" & adRecordSet.Fields("dnsHostName")elseWScript.echo "User Name: " & adRecordSet.Fields("samAccountName")end ifif instr(searchCategory,"spn")>0 ThenspnCollection = adRecordSet.Fields("servicePrincipalName")for each individualSPN in spnCollectionif spnClass="*" ThenWScript.Echo Chr(9) + individualSPNelseSelect Case searchCategoryCase "spn"if Lcase(split(individualSPN,"/")(0)) = lcase(spnClass) ThenWScript.Echo Chr(9) + individualSPNend ifCase "duplicatespn"if Lcase(individualSPN) = lcase(spn) ThenduplicateSPNArray = duplicateSPNArray & Lcase(individualSPN) & " for " & split(split(adRecordSet.Fields("objectCategory"),",")(0),"=")(1) & ":" & adRecordSet.Fields("samAccountName") & Chr(29)end ifCase "requiredspn"End SelectEnd ifnextend ifWScript.EchoadRecordSet.MoveNextLoopIf searchCategory = "duplicatespn" ThenIf UBound(Split(duplicateSPNArray,Chr(29)))>1 ThenWScript.Echo "Duplicate SPNs found"For tempDuplicateCount=0 to UBound(Split(duplicateSPNArray,Chr(29)))-1WScript.Echo Split(duplicateSPNArray,Chr(29))(tempDuplicateCount)NextEnd IfEnd IfWScript.Echo ""If adRecordset.RecordCount>1 Then WScript.Echo "Found " & adRecordset.RecordCount & " accounts" Else WScript.Echo "Found " & adRecordset.RecordCount & " account"end ifadRecordset.CloseadConn.CloseIf Err Then MsgBox Err.MessageEnd FunctionFunction getCategoryCount(myFilterValue, myFilterCategory)'This function accepts 2 parameters. First paramenter is the filter value and second param is filter category.'If you want to pass in your own filter string with various categories, you can pass "" as the second param.gcPath = getGCPath()searchCategory = myFilterCategorySelect Case lcase(searchCategory)Case "spn"tempFilter = "(servicePrincipalName=" & myFilterValue & ")"Case "user"tempFilter = "(&(objectCategory=person)(sAMAccountName=" & myFilterValue & "))"Case "computer"tempFilter = "(&(objectCategory=computer)(cn=" & myFilterValue & "))"Case elsetempFilter = myFilterValueEnd SelectDim tempCategoryCounttempCategoryCount = 0Set adConn = CreateObject("ADODB.Connection")Set adCmd = CReateObject("ADODB.Command")adConn.Provider = "ADsDSOObject"adConn.Open "ADs Provider"Set adCmd.ActiveConnection = adConnadQuery = "<" + gcPath + domainInput + ">;" & tempFilter & ";objectCategory,dnsHostName,servicePrincipalName,sAMAccountName;subtree"'WScript.Echo adQuery'WScript.QuitadCmd.CommandText = adQuerySet adRecordSet = adCmd.Executeif adRecordSet.EOF and adRecordSet.Bof ThenelseDo While not adRecordset.EofIf Err Then Exit Doif searchCategory = "spn" ThenspnCollection = adRecordSet.Fields("servicePrincipalName")for each individualSPN in spnCollectionIf lcase(individualSPN) = lcase(myFilterValue) ThentempCategoryCount  = tempCategoryCount  + 1End IfnextelsetempCategoryCount = tempCategoryCount + 1end if   adRecordSet.MoveNextLoopend ifgetCategoryCount = tempCategoryCountadRecordset.CloseadConn.CloseEnd FunctionFunction showRequiredSPNs(Product)Select Case ProductCase "IIS"If MsgBox("Is IIS running in a Cluster or NLB",vbYesNo)=vbYes Then 'Running in Cluster or NLB is truestrClusterName = InputBox("Enter the Cluster Name")If strClusterName = "" Then WScript.QuitIf getPingResult(strClusterName,errorMessage)="" ThenIf MsgBox(errorMessage & ". Do you want to continue?",vbYesNo)<>vbYes Then WScript.QuitEnd IfstrDomainAccount = InputBox("Enter the Domain Account that the application pool is running under")If strDomainAccount = "" Then WScript.QuitstrRequiredSPN = "HTTP/" & strClusterNameIf instr(strDomainAccount,"\") > 0 thenIf getCategoryCount(split(strDomainAccount,"\")(1), "user")=0 ThenWScript.Echo "Domain account " & strDomainAccount & " does not exist"WScript.QuitEnd IfElseIf getCategoryCount(strDomainAccount, "user")=0 ThenWScript.Echo "Domain account " & strDomainAccount & " does not exist"WScript.QuitEnd IfEnd IfIf getCategoryCount(strRequiredSPN, "spn")>0 ThenWScript.Echo "SPN " & " is already set. Use search option for finding the account that it is set for"WScript.QuitEnd IfWScript.Echo "You need to set the SPN " & strRequiredSPN & " for domain account " & strDomainAccountElseIf MsgBox("Is IIS application pool running under domain account",vbYesNo)=vbYes Then strHostName = InputBox("Enter the hostname or host header or FQDN that you use to access the application")If strHostName = "" Then WScript.QuitIf getPingResult(strHostName,errorMessage)="" ThenIf MsgBox(errorMessage & ". Do you want to continue?",vbYesNo)<>vbYes Then WScript.QuitEnd IfstrDomainAccount = InputBox("Enter the Domain Account that the application pool is running under")If strDomainAccount = "" Then WScript.QuitIf instr(strDomainAccount,"\") > 0 thenIf getCategoryCount(split(strDomainAccount,"\")(1), "user")=0 ThenWScript.Echo "Domain account " & strDomainAccount & " does not exist"WScript.QuitEnd IfElseIf getCategoryCount(strDomainAccount, "user")=0 ThenWScript.Echo "Domain account " & strDomainAccount & " does not exist"WScript.QuitEnd IfEnd IfstrRequiredSPN = "HTTP/" & strHostNameIf getCategoryCount(strRequiredSPN, "spn")>0 ThenWScript.Echo "SPN " & strSPNRequired & " is already set. Use search option for finding the account that it is set for"WScript.QuitElseWScript.Echo "You need to set SPN " & strRequiredSPN & " for domain account " & strDomainAccountWScript.QuitEnd IfElsestrHostName = InputBox("Enter the host header or FQDN that you use to access the application")If strHostName = "" Then WScript.QuitIf getPingResult(strHostName,errorMessage)="" ThenIf MsgBox(errorMessage & ". Do you want to continue?",vbYesNo)<>vbYes Then WScript.QuitEnd IfIf MsgBox("Are you accessing the application with netbios name or FQDN or CNAME alias of IIS server?",vbYesNo)=vbYes ThenstrRequiredSPN = "host/" & strHostNameIf getCategoryCount(strRequiredSPN, "spn")>0 ThenWScript.Echo "Required SPN " & strRequiredSPN & " is already set. Use search option for finding the account that it is set for"WScript.QuitElseWScript.Echo "You need to set SPN " & strRequiredSPN & " for IIS server's netbios name"WScript.QuitEnd IfEnd IfstrHostHeader = InputBox("Enter the host header that you use to access the application")If strHostHeader = "" Then WScript.QuitstrRequiredSPN = "http/" & strHostHeaderIf getCategoryCount(strSPNRequired, "spn")>0 ThenWScript.Echo "A required SPN " & strSPNRequired & " is already set. Use search option to find the account the SPN is set to. If the required SPN is found under a different account, remove and add it to the IIS server's machine account."WScript.QuitElseWScript.Echo "You need to set SPN " & strRequiredSPN & " for IIS server's netbios name"WScript.QuitEnd IfEnd IfEnd IfCase Elsecall Help()End SelectEnd Functioncall Main()'
  3. 将该文件保存为 Spnhelper.vbs。

  4. 在命令提示符下,使用适当的命令行选项运行 Spnhelper.vbs 文件。注意:若要查看 Spnhelper.vbs 文件的命令行选项,请在命令提示符下键入Spnhelper.vbs/help ,然后按 enter 键。

其他注意事项

所需的 Spn 设置为计算机帐户或域帐户时,Kerberos 身份验证可能会失败。如果意外,Kerberos 身份验证失败,请执行以下操作:

  • 验证存在全局编录中的不重复的 Spn 的 SPN。例如,如果 HTTP/www.test.com SPN 设置为 myDomain\appPool1 帐户,并且为 myDomain\appPool2 帐户,即使对于不同的帐户设置 Spn 存在重复的 SPN。此外,如果 HTTP/iis6server1.mydomain.com SPN 设置为 myDomain\appPool1 帐户,并 HTTP/iis6server1.mydomain.com SPN 也是与该服务器的计算机帐户相关联,您还可以重复的 SPN。您可以有一个主机 SPN 和一个 HTTP SPN。显式 HTTP SPN 将覆盖的隐式一种属于主机条目。但是,如果用户键入的是使用多个用户帐户或多个计算机帐户关联的 URL,则必须重复的 SPN。

  • 验证的 Spn 已复制到其他域控制器。在域控制器之间的复制问题,可以防止 Spn 复制到其他域控制器。当 Spn 不会复制到其他域控制器时,应用程序可能无法从某些客户端计算机。例如,如果 HTTP/www.test.com SPN 设置为 myDomain\appPool1 帐户在域控制器上,HTTP/www.test.com SPN 可能找不到第二个域控制器上的 myDomain\appPool1 帐户如果 SPN 尚未复制到第二个域控制器。注意:默认情况下,复制需要 15 分钟。

  • 请验证该 Web 服务器配置为支持 Kerberos 身份验证。若要执行此操作,请验证 IIS 元数据库中的 NTAuthenticationProviders 键的设置尚未更改ntlm。默认设置是协商,NTLM

  • 验证服务器或被委派凭据的服务受信任以进行委派。

  • 验证下运行服务的帐户被信任以便用于委任。

  • 在活动目录中,请验证访问应用程序的用户,清除敏感帐户,不能被委派复选框。

  • 如果您直接从服务器访问应用程序,验证环回安全检查复选框被清除。有关如何验证是否禁用了环回检查的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

    时,收到错误 401.1 浏览 Web 站点使用集成身份验证并承载于 IIS 5.1 或 IIS 6 上

  • 验证客户机启用了 Kerberos 的客户端。同时,验证在 Internet Explorer 中启用了启用 Windows 集成身份验证设置。若要执行此操作,单击Internet 选项工具菜单上,单击高级选项卡,然后确保已选中启用 Windows 集成身份验证复选框。

  • 验证所有计算机的 Kerberos 过程一部分具有一致的名称解析,并通过 Kerberos 信任连接。例如,验证 Kerberos 过程中涉及的计算机位于同一个林或跨林 Kerberos 信任的一部分。

  • 请验证令牌的大小不能超过为MaxTokenSize属性设置的值。同时,验证请求的大小不能超过为MaxFieldLength属性设置的值。如果用户的 Kerberos 过程的一部分是许多组的成员,可能会超出这些值。

    错误消息当 Outlook Web Access 用户尝试访问 Exchange Server 2003年中的邮箱:"HTTP 400 错误的请求 (请求标题太长)"

  • 请验证配置域为应用程序池的帐户时,启用所需的安全策略。若要执行此操作,请验证域帐户是下列运行 IIS 的计算机上的本地安全策略的成员:

    • 调整进程的内存配额

    • 作为服务登录

    • 替换进程级令牌

  • 验证通过 UDP 正常工作 Kerberos 身份验证。默认情况下,Kerberos 身份验证使用 UDP。但是,UDP 数据包的丢失会导致 Kerberos 身份验证失败。发生此问题时,您可以强制使用 TCP 的 Kerberos 身份验证。关于如何强制使用 TCP 的 Kerberos 身份验证的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

    如何强制 Kerberos 使用 TCP,而不是 Windows Server 2003 中,Windows XP 和 Windows 2000 中的 UDP

  • 验证身份验证器的时间戳不不同了来自服务器的时间戳超过五分钟。有关如何解决的时间戳差异的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

    如果没有同步的时间和日期, 不能登录。

  • 验证,88 的 TCP/UDP 端口未被防火墙或路由器阻止。默认情况下,Kerberos 身份验证使用 TCP/UDP 端口 88。

  • 验证域模式环境至少一个 Microsoft Windows 2000 本机模式环境。有关如何确定域模式的详细信息,请访问下面的 Microsoft 网站:

  • 在客户端,请验证 Web 应用程序的 URL 被添加到本地 intranet 站点。关于如何将 URL 添加到本地 intranet 的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

    intranet 站点标识为 Internet 网站,当您使用 FQDN 或 IP 地址

  • 验证每个千兆位以太网设备使用最新的驱动程序版本。驱动程序千兆以太网设备已过时,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章时,可能发生的问题的详细信息:

    无法连接到域控制器,不能将组策略应用千兆位以太网设备

有关如何使用负载平衡的 Web 站点使用 Kerberos 身份验证的详细信息,请访问下面的 Microsoft 网站:

有关代理服务器上使用 Kerberos 身份验证,则可能发生问题的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

Internet Explorer 不支持代理服务器使用 Kerberos 身份验证有关如何配置 IIS 以便支持 Kerberos 协议和 NTLM 协议的网络身份验证的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

如何配置 IIS 以便支持 Kerberos 协议和 NTLM 协议的网络身份验证有关如何配置 Windows SharePoint Services 的虚拟服务器,以使用 Kerberos 身份验证,以及如何从 Kerberos 身份验证切换回 NTLM 身份验证,请单击下面的文章编号,以查看在文章Microsoft 知识库文章:

如何配置为使用 Kerberos 身份验证的 Windows SharePoint Services 虚拟服务器以及如何从 Kerberos 身份验证切换回 NTLM 身份验证有关可以使用 Kerberos 身份验证协议连接到的 Web 服务器上使用非标准端口在 Windows XP 或 Windows Server 2003 时出现的问题的详细信息,请单击下面的文章编号,以查看 Microsoft 中的文章知识文库:

Internet Explorer 6 无法使用 Kerberos 身份验证协议连接到的 Web 服务器上使用非标准端口在 Windows XP 或 Windows Server 2003

需要更多帮助?

扩展你的技能
了解培训
抢先获得新功能
加入 Microsoft 内部人员

此信息是否有帮助?

谢谢您的反馈意见!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×