Web服务在IIS 7上的ServicePrincipleName设置

我很困惑。

考虑以下几点:

  • 具有名为DOM的域的Active Directory环境
  • 一个NetBIOS名称为VS1的IIS 7框
  • 提供VS1别名的DNSlogging,如pineapple.london.uk.corp
  • 作为DOM \ PineappleService运行的应用程序池
  • 启用Windows身份validation。
  • 客户端使用HttpWebRequest来调用框中的XML / JSON ASP.NET服务。

该服务呼叫到networking上的工作站来收集信息。 这在我使用运行IIS的IIS Express的开发中起作用,因为IISX只是一个.exe

在生产中,服务工作正常,身份validation正常,但调用导致服务(以PineappleService身份运行)访问networking内容的function失败。

我怀疑SPN注册问题,但我不知道要设置什么SPN。

最近,我偶然发现了这篇文章,似乎在说一些其他文章的飞:

http://blogs.msdn.com/b/webtopics/archive/2009/01/19/service-principal-name-spn-checklist-for-kerberos-authentication-with-iis-7-0.aspx

请注意,它说

SPN要求与上面保持一致。 不像在IIS 6.0中(我们必须添加一个http /用于应用程序池标识的SPN),您不必像http /为Domain1 \ Username1添加SPN。

所以我不知道什么是对的。 我不知道是否需要注册HTTP SPN或主机SPN或使用DNS别名或NetBIOS名称,并将它们设置在PineappleService帐户或VS1计算机帐户上。

我不知道当我尝试的事情,有一个缓慢的AD复制问题,这意味着我必须等待一个小时之间的试错。

现在都很复杂 我已经作为一个系统和开发15年,我感觉到域和工作站,权利和政策的结束。 这一切都变得太多了。

谢谢你的帮助。

卢克

只有在开发过程中完全按照生产过程进行configuration和testing之后,才能尝试这种方法。 对IIS和自定义应用程序使用Windows身份validation和模拟可能非常复杂。 即使是在没有一个精确反映生产的开发环境的情况下神奇地工作在生产环境中,如果你需要调查一个问题,你也会完全迷失方向。

SPN

创buildSPN时,习惯上为fqdn和短名称创build一个SPN。 例:

setspn.exe -A http/computer setspn.exe -A http/computer.domain.com 

这些是可取的,以匹配的Windows 2000的名称(NetBIOS名称)和连接到服务时将使用的DNS名称。 如果这两个名称都不是用于连接服务的名称,那么该名称也应该有一个SPN。

在不同帐户/计算机上注册相同服务/名称的重复SPN是Kerberos委派不起作用的常见原因。 Setspn会很乐意让你创build重复的SPN。 Microsoft已经发布了一个修补程序来纠正此问题:

在Windows 7或Windows Server 2008 R2中运行setspn命令和-a开关时,会注册重复的SPN
https://support.microsoft.com/kb/2717045

服务所在的目标计算机需要SPN。

  HTTP/computername.company.com HTTP/computername 

值得信赖的授权

将要执行模拟的计算机或用户帐户需要指定为“可信委派”。 如果用户帐户正在执行模拟,那么执行模拟的计算机帐户也必须以相同方式configuration为“委派可信”。

在“Active Directory用户和计算机”中,单击计算机或用户帐户上的委派选项卡。 (用户帐户除非具有SPN,否则不会显示“委派”选项卡,可能需要将RPC /用户名等SPN分配给用户帐户以显示“委派”选项卡)。

在委派选项卡上,select“信任此用户/计算机委派任何服务(仅Kerberos)”以进行无约束委派。

对于受约束的委派,请select“信任此用户/计算机委派给指定的服务”。 select“使用任何身份validation协议”。 您可以单击“添加”并浏览到公布服务SPN的计算机,然后添加它们。 请注意,当您运行setspn.exe -L域\ useraccount时,这些不会显示为SPN。

委托模式

您需要确定使用哪个委派模型。 这个决定可能由于安全原因而被强制。

不受限制允许计算机或服务帐户冒充任何用户。 这是非常强大的,并被许多组织所避免。

受约束的委托将模拟活动限制到正在执行模拟的服务帐户可能连接的特定目标计算机和服务(HTTP,CIFS,…)。 它还具有额外的便利,它可以模拟任何帐户,而无需拥有帐户凭证或预先存在的Windows / Kerberos安全令牌

多个域名

如果FE / BE服务器位于不同的域中,则受限制的委派不起作用。

通过约束委派,执行模拟的帐户/计算机必须与目标资源/服务位于同一个域中。 这个域通常是“资源”域。 正在模拟的帐户可能位于任何受信任的域中,包括其他林中的受信任域。

特权提升

执行模拟的用户帐户必须在运行代码的计算机上持有SetTCB权限(作为操作系统的一部分),以执行模拟。 请注意,在Windows Vista / 7/2008上,SetTCB权限只能由具有高完整性级别的进程保留,因此可能需要将该帐户添加到本地pipe理员组。

授权用户身份必须是要执行模拟的计算机上的本地“用户”组的成员。

作为操作系统的一部分,可以使用gpedit.msc或gpmc.msc进行分配。 它位于计算机> Windows设置>安全设置>本地策略>用户权限分配下。

Kerberos版本5authentication协议的工作原理
http://technet.microsoft.com/en-us/library/cc772815%28WS.10%29.aspx

  • 如果选中“仅使用Kerberos”选项,则帐户使用约束委派而不进行协议转换。
  • 如果select使用任何身份validation协议选项,则该帐户正在使用带约定转换的约束委派

呼! 所有configuration都正确之后,您可以将其全部提供给一个易于排除故障的简单testing用例。 比方说,您已经为CIFS \ fileserver.company.com创build了一个SPN,并且要模拟[email protected]并访问该服务器上的一个共享:

 // no password required with constrained delegation using (WindowsIdentity id = new WindowsIdentity("[email protected]")) using (WindowsImpersonationContext wic = id.Impersonate()) { // ImpersonationLevel will be "Impersonation" when constrained delegation is setup correctly // It will be "Identification" if the account performing impersonation does not have SetTCB privilege Debug.WriteLine("ImpersonationLevel: " + id.ImpersonationLevel); // Authentication type should be "Kerberos" Debug.WriteLine("AuthenticationType: " + id.AuthenticationType); Debug.WriteLine("Username: " + WindowsIdentity.GetCurrent().Name); Debug.WriteLine("Groups:"); foreach (IdentityReference identity in id.Groups) { NTAccount ntaccount = identity.Translate(typeof (NTAccount)) as NTAccount; Debug.WriteLine("Account: " + ntaccount.Value + " SID: " + identity.Value); } // This will fail with access denied if constrained delegation is not setup properly. // On the target server/resource, if it fails it may show an attempt to logon using anonymous string[] fileNames = Directory.GetFiles(@"\\fileserver.company.com\ShareName"); foreach (string fileName in fileNames) { Console.WriteLine(fileName); } } 

这很可能不是SPN问题。 在您的服务帐户(PineappleService)下运行的应用程序池很可能没有权限访问networking上的资源。 您没有真正提供任何错误消息,但确实听起来像是一个简单的权限问题。

您需要确保您的服务帐户可以访问您正在尝试获得的任何内容(您应该详细说明您的问题),无论是文件,信息等等。

对于testing,您可以让您的服务帐户成为域中的pipe理员,但您确定不应该像后期部署一样。