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

文章翻译 文章翻译
文章编号: 929650 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文介绍了服务主体名称 (spn)。本文还介绍了如何使用 spn Microsoft Internet Information Services (IIS) 上配置了承载的 Web 应用程序时。本文还介绍了在 Windows 集成身份验证在协商过程。协商安全标头可让客户端选择之间 Kerberos 身份验证和 NTLM 身份验证。

此外,本文还介绍了需要启用 Kerberos 身份验证的 SPN 的常见方案。 最后一节描述的 Kerberos 身份验证可能失败的情况。最后一节还提供了故障排除步骤。

简介

重要本文中讨论的主题应用于 Internet Information Services (IIS) 6.0。 如果通过设置为 false 的配置设置 useKernelMode 禁用内核模式身份验证,该主题也应用于 IIS 7.0 和 7.5。
本分步指南介绍了如何使用服务主体名称 (spn) 配置 Web 应用程序承载时上 IIS.IIS 刀协商安全标头时 Windows 集成身份验证用于对客户端请求进行身份验证。协商安全标头可让客户端选择之间 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 语法使用正斜杠字符 (/) 分隔的元素。因此,正斜杠字符 (/) 不能出现在服务类名。

在 HOST 服务和 HTTP 服务类

在 HOST 服务表示主计算机。Kerberos 协议来访问主机计算机使用 HOST SPN。Kerberos 协议使用长期密钥在主机上创建服务票证。

HTTP 服务类是一个充当 HOST SPN 别名的内置服务。HOST SPN 被映射到主机计算机帐户。因此,您在使用默认 HTTP 服务类时 Kerberos 协议使用计算机帐户作为服务帐户来请求服务票证。

常见方案

本部分介绍可能需要一个 SPN 的情况。此外,这一节演示如何确定要设置每个方案的 SPN。在这些方案中使用下列术语:
收起该表格展开该表格
IIS6server1运行 IIS 的计算机的主机名
mydomainIIS6server1 计算机已加入到域
appPool1用于应用程序池标识 mydomain 域中用户帐户
appPool2所使用的第二个应用程序池标识 mydomain 域中用户帐户
www.test.com第一个 Web 站点的主机标头
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,和添加或删除补充的 spn。

若要获得 Microsoft Windows Server 2003 Setspn.exe 工具,单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
970536Windows Server 2003 Setspn.exe 支持工具更新

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

当 IIS 应用程序域的用户帐户而不是默认网络服务帐户下运行时,必须设置 HTTP 服务域帐户下的 SPN。在这种情况下您可以访问 IIS 应用程序使用运行 IIS 的服务器的 NetBIOS 名称或运行 IIS 的服务器的 FQDN。

若要访问 IIS 应用程序使用的 NetBIOS 名称,使用其中 NETBIOS_NAME_OF_IIS_SERVER 是运行 IIS 的服务器的 NetBIOS 名称下面的命令:
Setspn – S HTTP / NETBIOS_NAME_OF_IIS_SERVER domain\username
例如对于命令可能类似于以下命令:
Setspn – S HTTP/iis6server1 mydomain\appPool1
若要通过 FQDN) 访问 IIS 应用程序,使用其中 FQDN_OF_IIS_SERVER 是运行 IIS 的服务器的 FQDN 下面的命令:
Setspn – S HTTP / FQDN_OF_IIS_SERVER domain\username
例如对于命令可能类似于以下命令:
Setspn – S HTTP/iis6server1.mydomain.com mydomain\appPool1

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

当使用主机头访问 Web 应用程序时,必须设置 HTTP 服务的 SPN。

您在运行 Web 应用程序,如网络服务帐户、 本地服务帐户或本地系统帐户的默认帐户时您可以使用以下命令:
Setspn –A HTTP / HOST_HEADER NETBIOS_NAME_OF_IIS_SERVER
在此命令 HOST_HEADER 是服务器的主机标头在访问该的应用程序的浏览器窗口中键入和 NETBIOS_NAME_OF_IIS_SERVER 是服务器的运行 IIS 的 NetBIOS 名称。

例如对于应用程序的命令可能类似于以下命令:
Setspn –A HTTP/www.test.com iis6server1
如果您在运行在域帐户应用程序可以使用以下命令:
Setspn –A HTTP / HOSTHEADER_OR_DNS_ALIAS domain\username
在此命令 HOSTHEADER_OR_DNS_ALIAS 是主机标头或 DNS 别名用来访问该 Web 应用程序。

例如对于应用程序的命令可能类似于以下命令之一:
  • Setspn –A HTTP/www.test.com mydomain\appPool1
  • Setspn –A HTTP/www.test3.com mydomain\appPool2

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

当 IIS 运行在群集环境中或在负载平衡环境中时,您访问应用程序使用群集名而不是使用一个节点的名称。这种情况下包括网络负载平衡。群集技术中一个节点是指一台计算机是群集的成员。要使用 Kerberos 身份验证协议,在这种情况下为,必须将 IIS 中的每个节点上应用程序池标识配置为使用相同的域用户帐户。若要配置为使用相同的域用户帐户的每个 IIS 节点,使用以下命令:
Setspn –A HTTP / CLUSTER_NAME 域 \ 用户名
例如对于命令可能类似于以下命令之一:
  • Setspn –A HTTP/www.myIISCluster.com mydomain\appPool1
  • Setspn –A 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 –A MSSQLSvc / FQDN_OF_SQLSERVER:port SQLSERVER_COMPUTER_NAME
如果正在运行 SQL Server 的后端计算机正在运行在域帐户在 MSSQLSvc 下 / FQDN_OF_SQL_SERVER:port 端口号必须是可用于域帐户。若要确定域帐户的 spn 使用以下命令:
Setspn –L 域 \ 用户名
使用下列命令之一来设置 SPN 运行 SQL Server 的计算机的名称:
  • Setspn –A MSSQLSvc / FQDN_OF_SQLSERVER:portFQDN_OF_SQLSERVER
  • Setspn –A MSSQLSvc / FQDN_OF_SQLSERVER:portdomain\username

SPN 帮助器脚本

使用下面的示例脚本可以为 IIS 应用程序中找到该 spn。您还可以使用此脚本发现重复的 spn。若要用于此脚本,请按照下列步骤操作:
  1. 单击 开始,单击 运行,键入 记事本,然后单击 确定
  2. In the Notepad file, paste the following script:
    Dim argSPN, argUser, argComputer, spnToSearch, objCategory, strFilter, searchCategory, domainInput
    
    Function Help()
    Dim strMessage
    strMessage = 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.Quit
    End Function
    
    Function 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 then
    		domainInput = ",DC=" & split(argUser,"\")(0)
    		argUser = split(argUser,"\")(1)
    	end if
    End Function
    
    Function resetValues()
    	spnToSearch = ""
    	objCategory = ""
    	strFilter = ""
    End Function
    
    Function getGCPath()
    	Dim tempGCPath, objGC, tempGC, tempStr
    	Set objGC = GetObject("GC:")
    	for each tempGC in objGC
    		tempGCPath = tempGC.ADsPath
    	next
    	if tempGCPath <> "" then
    		getGCPath = tempGCPath
    	else
    		WScript.Echo "Unable to find active directory"
    		WScript.Quit
    	end if
    	For 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) & tempSeperator
    	Next
    	getGCPath = tempGCPath & "/" & tempStr
    End Function
    
    Function getSPNClass()
    	Dim tempSPNClass
    	If trim(argSPN)="" Then getSPNClass = "*": Exit Function
    	If instr(argSPN,"/")=0 Then getSPNClass = "*": Exit Function
    	If instr(split(argSPN,"/")(0),"*")>0 Then getSPNClass = "*": Exit Function
    	getSPNClass = split(argSPN,"/")(0)
    End Function
    
    Function isSPNInputValid(spnIN)
    	isSPNInputValid = ""
    	If instr(spnIN,"/")=0 Then Exit Function
    	If instr(spnIN,"*")>0 Then Exit Function
    	isSPNInputValid = spnIN
    End Function
    
    Function Main()
    	Dim paramSPN
    	paramSPN = ""
    	call  resetValues()
    	call setArguments()
    	Select Case searchCategory
    		Case "spn"
    			if (argUser = "" and argComputer = "") or (argUser <> "" and argComputer <> "") then WScript.Echo "You must use /spn along with /computer or /user": WScript.Quit
    			if argSPN = "" then argSPN = "*"
    			spnToSearch = "(servicePrincipalName=" & argSPN & ")"
    			if argUser <> "" then objCategory = "(objectCategory=person)(sAMAccountName=" & argUser & ")"
    			if argComputer <> "" then 
    				objCategory = "(objectCategory=computer)(cn=" & argComputer & ")"
    			End If
    			strFilter = "(&" & spnToSearch & objCategory & ")"
    		Case "duplicatespn"
    			If isSPNInputValid(argSPN)="" Then WScript.Echo "Invalid SPN input. Please verify and try again.": WScript.Quit
    			spnToSearch = "(servicePrincipalName=" & argSPN & ")"
    			strFilter = spnToSearch
    			paramSPN = argSPN
    		Case "requiredspn"
    			call showRequiredSPNs("IIS")
    			WScript.Quit
    		Case "computer"
    			objCategory = "(&(objectCategory=computer)(cn=" & argComputer & "))"
    			strFilter = objCategory
    		Case "user"
    			objCategory = "(&(objectCategory=person)(sAMAccountName=" & argUser & "))"
    			strFilter = objCategory
    		Case else
    			call Help()
    			WScript.Quit
    	End Select
    	call getSPNs(paramSPN)
    End Function
    
    Function getPingResult(hostName,errorMessage)
    'On Error Resume Next
    getPingResult = ""
    	If instr(hostName,".")=0 Then
    		Dim tempGCPath, objGC, tempGC
    		Set objGC = GetObject("GC:")
    		for each tempGC in objGC
    			tempGCPath = tempGC.ADsPath
    		next
    		if tempGCPath <> "" then
    			gcPath = tempGCPath
    		else
    			WScript.Echo "Unable to find active directory"
    			WScript.Quit
    		end if
    		Set adConn = CreateObject("ADODB.Connection")
    		Set adCmd = CReateObject("ADODB.Command")
    		adConn.Provider = "ADsDSOObject"
    		adConn.Open "ADs Provider"
    		Set adCmd.ActiveConnection = adConn
    		adQuery = "<" + gcPath + ">;" & "(&(objectCategory=computer)(cn=" & hostName & "))" & ";dnsHostName;subtree"
    		'WScript.Echo adQuery
    		'WScript.Quit
    		adCmd.CommandText = adQuery
    		Set adRecordSet = adCmd.Execute
    		if adRecordSet.RecordCount>0 Then 
    			If IsNull(adRecordSet.Fields("dnsHostName"))=0 Then 
    				getPingResult = adRecordSet.Fields("dnsHostName") 
    				hostName = getPingResult 
    			Else 
    				getPingResult = hostName
    			End If
    		else 
    			errorMessage = "Could not find " & hostname & " in the active directory"
    		end if
    
    		Exit Function
    	End If
    	getPingResult = hostName
    Exit Function
    'If Err Then getPingResult = hostName
    End Function
    
    Function getSPNs(spn)
    	Dim spnClass, duplicateSPNArray
    	spnClass = getSPNClass()
    	duplicateSPNArray = ""
    	gcPath = getGCPath()
    	Set adConn = CreateObject("ADODB.Connection")
    	Set adCmd = CreateObject("ADODB.Command")
    	adConn.Provider = "ADsDSOObject"
    	adConn.Open "ADs Provider"
    	Set adCmd.ActiveConnection = adConn
    	adQuery = "<" + gcPath + domainInput + ">;" & strFilter & ";distinguishedName,objectCategory,dnsHostName,servicePrincipalName,sAMAccountName;subtree"
    	'WScript.Echo adQuery
    	'WScript.Quit
    	adCmd.CommandText = adQuery
    	Set adRecordSet = adCmd.Execute
    	if adRecordSet.EOF and adRecordSet.Bof Then
    		WScript.echo "No " & searchCategory & " found with the given criteria."
    	else
    		If adRecordSet.RecordCount>10 Then
    			If 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 Function
    		End If
    		Do While not adRecordset.Eof
    			If Err Then Exit Do
    			WScript.echo "Class: " & split(split(adRecordSet.Fields("objectCategory"),",")(0),"=")(1)
    			WScript.Echo adRecordSet.Fields("distinguishedName")
    			if UCase(adRecordSet.Fields("objectCategory")) = "COMPUTER" Then
    				WScript.echo "Computer Name" & adRecordSet.Fields("dnsHostName")
    			else
    				WScript.echo "User Name: " & adRecordSet.Fields("samAccountName")
    			end if
    			if instr(searchCategory,"spn")>0 Then
    				spnCollection = adRecordSet.Fields("servicePrincipalName")
    				for each individualSPN in spnCollection
    					if spnClass="*" Then
    					WScript.Echo Chr(9) + individualSPN
    					else
    						Select Case searchCategory
    							Case "spn"
    								if Lcase(split(individualSPN,"/")(0)) = lcase(spnClass) Then
    									WScript.Echo Chr(9) + individualSPN
    								end if
    							Case "duplicatespn"
    								if Lcase(individualSPN) = lcase(spn) Then
    									duplicateSPNArray = duplicateSPNArray & Lcase(individualSPN) & " for " & split(split(adRecordSet.Fields("objectCategory"),",")(0),"=")(1) & ":" & adRecordSet.Fields("samAccountName") & Chr(29)
    								end if
    							Case "requiredspn"
    						End Select
    					End if
    				next
    			end if
    			WScript.Echo
    			adRecordSet.MoveNext
    		Loop
    		If searchCategory = "duplicatespn" Then
    			If UBound(Split(duplicateSPNArray,Chr(29)))>1 Then
    				WScript.Echo "Duplicate SPNs found"
    				For tempDuplicateCount=0 to UBound(Split(duplicateSPNArray,Chr(29)))-1
    					WScript.Echo Split(duplicateSPNArray,Chr(29))(tempDuplicateCount)
    				Next
    			End If
    		End If
    		WScript.Echo ""
    		If adRecordset.RecordCount>1 Then WScript.Echo "Found " & adRecordset.RecordCount & " accounts" Else WScript.Echo "Found " & adRecordset.RecordCount & " account"
    	end if
    	adRecordset.Close
    	adConn.Close
    	If Err Then MsgBox Err.Message
    End Function
    
    Function 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 = myFilterCategory
    	Select Case lcase(searchCategory)
    		Case "spn"
    			tempFilter = "(servicePrincipalName=" & myFilterValue & ")"
    		Case "user"
    			tempFilter = "(&(objectCategory=person)(sAMAccountName=" & myFilterValue & "))"
    		Case "computer"
    			tempFilter = "(&(objectCategory=computer)(cn=" & myFilterValue & "))"
    		Case else
    			tempFilter = myFilterValue
    	End Select
    	Dim tempCategoryCount
    	tempCategoryCount = 0
    	Set adConn = CreateObject("ADODB.Connection")
    	Set adCmd = CReateObject("ADODB.Command")
    	adConn.Provider = "ADsDSOObject"
    	adConn.Open "ADs Provider"
    	Set adCmd.ActiveConnection = adConn
    	adQuery = "<" + gcPath + domainInput + ">;" & tempFilter & ";objectCategory,dnsHostName,servicePrincipalName,sAMAccountName;subtree"
    	'WScript.Echo adQuery
    	'WScript.Quit
    	adCmd.CommandText = adQuery
    	Set adRecordSet = adCmd.Execute
    	if adRecordSet.EOF and adRecordSet.Bof Then
    	else
    		Do While not adRecordset.Eof
    			If Err Then Exit Do
    			if searchCategory = "spn" Then
    				spnCollection = adRecordSet.Fields("servicePrincipalName")
    				for each individualSPN in spnCollection
    					If lcase(individualSPN) = lcase(myFilterValue) Then
    						tempCategoryCount  = tempCategoryCount  + 1
    					End If
    				next
    			else
    				tempCategoryCount = tempCategoryCount + 1
    			end if   
    			adRecordSet.MoveNext
    		Loop
    	end if
    	getCategoryCount = tempCategoryCount
    	adRecordset.Close
    	adConn.Close
    End Function
    
    Function showRequiredSPNs(Product)
    	Select Case Product
    		Case "IIS"
    			If MsgBox("Is IIS running in a Cluster or NLB",vbYesNo)=vbYes Then 'Running in Cluster or NLB is true
    				strClusterName = InputBox("Enter the Cluster Name")
    				If strClusterName = "" Then WScript.Quit
    				If getPingResult(strClusterName,errorMessage)="" Then
    					If MsgBox(errorMessage & ". Do you want to continue?",vbYesNo)<>vbYes Then WScript.Quit
    				End If
    				strDomainAccount = InputBox("Enter the Domain Account that the application pool is running under")
    				If strDomainAccount = "" Then WScript.Quit
    				strRequiredSPN = "HTTP/" & strClusterName
    				If instr(strDomainAccount,"\") > 0 then
    					If getCategoryCount(split(strDomainAccount,"\")(1), "user")=0 Then
    						WScript.Echo "Domain account " & strDomainAccount & " does not exist"
    						WScript.Quit
    					End If
    				Else
    					If getCategoryCount(strDomainAccount, "user")=0 Then
    						WScript.Echo "Domain account " & strDomainAccount & " does not exist"
    						WScript.Quit
    					End If
    				End If
    				If getCategoryCount(strRequiredSPN, "spn")>0 Then
    					WScript.Echo "SPN " & " is already set. Use search option for finding the account that it is set for"
    					WScript.Quit
    				End If
    				WScript.Echo "You need to set the SPN " & strRequiredSPN & " for domain account " & strDomainAccount
    			Else
    				If 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.Quit
    					If getPingResult(strHostName,errorMessage)="" Then
    						If MsgBox(errorMessage & ". Do you want to continue?",vbYesNo)<>vbYes Then WScript.Quit
    					End If
    					strDomainAccount = InputBox("Enter the Domain Account that the application pool is running under")
    					If strDomainAccount = "" Then WScript.Quit
    					If instr(strDomainAccount,"\") > 0 then
    						If getCategoryCount(split(strDomainAccount,"\")(1), "user")=0 Then
    							WScript.Echo "Domain account " & strDomainAccount & " does not exist"
    							WScript.Quit
    						End If
    					Else
    						If getCategoryCount(strDomainAccount, "user")=0 Then
    							WScript.Echo "Domain account " & strDomainAccount & " does not exist"
    							WScript.Quit
    						End If
    					End If
    					strRequiredSPN = "HTTP/" & strHostName
    					If getCategoryCount(strRequiredSPN, "spn")>0 Then
    						WScript.Echo "SPN " & strSPNRequired & " is already set. Use search option for finding the account that it is set for"
    						WScript.Quit
    					Else
    						WScript.Echo "You need to set SPN " & strRequiredSPN & " for domain account " & strDomainAccount
    						WScript.Quit
    					End If
    				Else
    					strHostName = InputBox("Enter the host header or FQDN that you use to access the application")
    					If strHostName = "" Then WScript.Quit
    					If getPingResult(strHostName,errorMessage)="" Then
    						If MsgBox(errorMessage & ". Do you want to continue?",vbYesNo)<>vbYes Then WScript.Quit
    					End If
    					If MsgBox("Are you accessing the application with netbios name or FQDN or CNAME alias of IIS server?",vbYesNo)=vbYes Then
    						strRequiredSPN = "host/" & strHostName
    						If getCategoryCount(strRequiredSPN, "spn")>0 Then
    							WScript.Echo "Required SPN " & strRequiredSPN & " is already set. Use search option for finding the account that it is set for"
    							WScript.Quit
    						Else
    							WScript.Echo "You need to set SPN " & strRequiredSPN & " for IIS server's netbios name"
    							WScript.Quit
    						End If
    					End If
    					strHostHeader = InputBox("Enter the host header that you use to access the application")
    					If strHostHeader = "" Then WScript.Quit
    					strRequiredSPN = "http/" & strHostHeader
    					If getCategoryCount(strSPNRequired, "spn")>0 Then
    						WScript.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.Quit
    					Else
    						WScript.Echo "You need to set SPN " & strRequiredSPN & " for IIS server's netbios name"
    						WScript.Quit
    					End If
    				End If
    				
    			End If
    		Case Else
    			call Help()
    	End Select
    End Function
    
    call 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。您可以有一个 HOST SPN 和一个 HTTP SPN。显式的 HTTP SPN 将重写隐式 HOST 条目下涉及的那个。但是,如果用户类型是与多个用户帐户或多个计算机帐户关联的 URL,您有重复的 SPN。
  • 验证该 spn 已复制到其他域控制器。

    在域控制器之间的复制问题,可以防止该 spn 将复制到其他域控制器。当该 spn 不要将复制到其他域控制器中时,该应用程序可能无法从某些客户端计算机。例如对于如果 HTTP/www.test.com SPN 设置为在域控制器上 myDomain\appPool1 帐户,HTTP/www.test.com SPN 可能无法找到的第二个域控制器上的 myDomain\appPool1 帐户如果 SPN 不被复制到第二个域控制器。

    注意默认状态下,复制大约需要 15 分钟。
  • 验证 Web 服务器被配置为支持 Kerberos 身份验证。要这样做验证 ntlm 尚未更改 NTAuthenticationProviders 密钥在 IIS 元数据库中的设置。默认设置为 协商、 NTLM
  • 验证在服务器或服务委派凭据的受信任委派。
  • 验证该服务正在运行在该帐户是受信任委派。
  • 活动的目录在验证 帐户是敏感的不能被委派 复选框被清除的用户访问应用程序。
  • 如果要直接从服务器访问应用程序,则确认清除了 环回安全检查 复选框。有关如何验证禁用环回检查的详细信息单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    896861当您浏览的网站使用集成身份验证并位于 IIS 5.1 或 IIS 6 上时,您会收到 401.1 错误
  • 验证客户端启用了 Kerberos 的客户端。同时,验证启用了在 Internet Explorer 中的 启用 Windows 集成身份验证 设置。要执行此操作在 工具 菜单上单击 Internet 选项 单击 高级 选项卡,然后确保已选中 启用 Windows 集成身份验证 复选框。
  • 验证 Kerberos 过程的一部分的所有计算机具有一致的名称解析,并由 Kerberos 信任连接。例如对于验证 Kerberos 过程中涉及的计算机位于同一目录林中,或者是跨目录林 Kerberos 信任关系的一部分。
  • 验证令牌的大小不超过为 MaxTokenSize 属性设置的值。同时,验证请求的大小不超过为 MaxFieldLength 属性设置的值。如果用户是 Kerberos 过程的一部分是许多组的成员,可能会超过这些值。
    920862当一个 Outlook Web Access 用户尝试访问在 Exchange Server 2003 中的邮箱时出现错误消息: HTTP 400 错误的请求 (太长请求标头)
  • 验证配置为应用程序池的域帐户时,已启用所需的安全策略。若要执行此操作验证域帐户是以下的本地安全策略,运行 IIS 的计算机上的成员:
    • 调整进程的内存配额
    • 作为服务登录
    • 替换进程级令牌
  • 验证通过 UDP 正常工作 Kerberos 身份验证。默认状态下,Kerberos 身份验证使用 UDP。但是,UDP 数据包的损失会导致 Kerberos 身份验证失败。发生此问题时,您可以强制使用 TCP 的 Kerberos 身份验证。有关如何强制使用 TCP 的 Kerberos 身份验证的详细信息单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    244474如何强制使用 TCP,而不是 Windows Server 2003 中、 Windows XP 中和在 Windows 2000 的 UDP Kerberos
  • 验证在身份验证者上的时间戳不会相差超过五分钟从服务器的时间戳。有关如何解决的时间戳差异的详细信息单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    232386无法登录,如果日期和时间不同步
  • 验证未被防火墙或路由器阻止 TCP/UDP 端口 88。默认状态下,Kerberos 身份验证使用 TCP/UDP 端口 88。
  • 验证域模式环境中至少一个 Microsoft Windows 2000 本机模式的环境。有关如何确定将域模式的详细信息请访问下面的 Microsoft 网站:
    http://technet2.microsoft.com/windowsserver/en/library/11b2d3d3-980c-4b64-9ed3-51778f1fe5771033.mspx?mfr=true
  • 在客户端,验证 Web 应用程序的 URL 被添加到本地 intranet 网站。有关如何将 URL 添加到本地 intranet 的详细信息单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    303650当您使用的 FQDN 或 IP 地址时,intranet 网站被标识为 Internet 站点
  • 验证每个千兆比特以太网设备正在使用最新的驱动程序版本。过时的千兆比特以太网设备驱动程序时可能发生的问题的有关的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    326152无法连接到域控制器并不能使用千兆以太网设备应用组策略

参考

有关如何与负载平衡 Web 站点使用 Kerberos 身份验证的详细信息请访问下面的 Microsoft 网站:
http://technet.microsoft.com/en-us/library/cc757299.aspx
有关代理服务器上使用 Kerberos 身份验证,则可能发生的问题的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
321728Internet Explorer 不支持使用代理服务器的 Kerberos 身份验证
有关如何将 IIS 配置成网络的身份验证的支持 Kerberos 协议和 NTLM 协议的详细信息单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
215383如何将 IIS 配置成网络的身份验证的支持 Kerberos 协议和 NTLM 协议
有关如何配置的详细信息使用 Kerberos 身份验证和如何从 Kerberos 身份验证切换回 NTLM 验证 Windows SharePoint Services 虚拟服务器,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
832769如何配置用于使用 Kerberos 身份验证的 Windows SharePoint Services 虚拟服务器以及如何从 Kerberos 身份验证切换回 NTLM 身份验证
当您连接到使用 Windows XP 上的非标准端口的 Web 服务器或 Windows Server 2003 使用 Kerberos 身份验证协议时,可能会发生的问题有关的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
908209Internet 浏览器 6 不能连接到使用 Windows XP 上的非标准端口的 Web 服务器或 Windows Server 2003 中使用 Kerberos 身份验证协议

属性

文章编号: 929650 - 最后修改: 2010年5月12日 - 修订: 5.0
这篇文章中的信息适用于:
  • Microsoft Internet Information Services 7.5
  • Microsoft Internet Information Services 7.0
  • Microsoft Internet Information Services 6.0
关键字:?
kbmt kbinfo kbhowto KB929650 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 929650
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com