【发布时间】:2017-09-27 19:27:51
【问题描述】:
所以我们有了这个旧的 asp 网站(它不会死)。
它目前位于 win2k12 上,它使用 spn 和 kerberos 委托进行设置。它使用一个运行 .vbs 的 Com+ 对象,该对象与活动目录进行大量对话。
我们开始推出 Windows 10 实施。
在我们的开发环境中,它适用于 win7/IE11 和 win10/IE11 在我们的生产环境中,win7/IE11 可以正常工作(现在仍然可以),但是 win10/IE11 不能正常工作。
一些错误信息是
Active Directory 错误“80040e37”
指定的目录服务属性或值不存在。
获取属性最大范围时出错
属性:[givenName]
错误描述:[-2147463153] 尝试的操作违反了 DS 架构规则。
通常这些表明网站配置不正确,但在 win7 上的每个人都可以正常工作。
因此,这将指向 win10 实现。
Windows 10 中的什么会导致此问题? (也许是特定的错误配置 gpo?)我很难过。
更新 1-.
GPO 似乎没有问题。不管是win7还是win10都是同一个gpo设置(不通过wmi过滤)。
所以该网站可以在 Windows8/ie11 中运行,它也可以在 win7 上的 Chrome 中运行(经过一些调整以启用 kerberos)
我已经设法创建了一个导致问题的小测试页面。
Dim oSysInfo
dim user
'on error resume next
'Get the Current Users information. This information is just the currently logged on user
' Set oSysInfo = Server.CreateObject("ADSystemInfo")
'Get Current User Object
sURL= "LDAP://AUsersDistinguishedName"
response.write(sURL & "<br />")
on error resume next
Set user = GetObject(sURL)
pAttribute = "givenName"
'response.write(user.get(pAttribute))
Dim cl, sc, pr, pr2, pAttribute
Set cl = GetObject(user.Schema)
'Test(user)
Set sc = GetObject(cl.Parent)
Set pr = sc.GetObject("Property", pAttribute)
response.write(pr.MaxRange)
Set cl = Nothing
Set sc = Nothing
Set pr = Nothing
'-2147463155: Not found in directory cache, that means the MaxRange property is empty or not set, so there is no error
if err.number <> 0 and err.number <> -2147463155 then
Response.Write "<br>Error description: [" & err.number & "] " & err.Description
End If
--- 更新 2。
我将添加有关 IIS 服务器的更多信息。
- 服务器有 2 个从 URL 指向服务器的 spn
- 服务器已设置为委托。
- 应用程序池在特定域帐户上运行。它设置为 32 位。
- Windows 身份验证是唯一启用的身份验证。 (扩展保护已关闭,启用内核模式身份验证已启用)。 Negociate 是第一个启用的提供程序。 Ntlm 是第二个。
更新 3: 我让微软参与了我的一个 msdn 事件。 当我们进行网络监控跟踪时,kerberos 似乎存在问题。
工作 - 使用 windows10 开发 票证:Realm:ourRealm,Sname:ldap/DomainControllerFQN
工作 - 使用 windows7 进行生产 票证:Realm:ourRealm,Sname:ldap/DomainControllerFQN
不工作 - 使用 windows10 进行生产 Ticket:领域:ourRealm,Sname:运行网站的帐户名称。 所有请求都属于 NLMP ( ntlm) 而不是使用 kerberos
至于 spn,它们在两个环境之间是相同的。当我们执行 setspn -l Webserver 时,这是它们的一个子集。
- http/WebsiteFQN -- 我们在 3 年前部署到 win2k12 时添加了这个
- http/websiteName -- 我们在 3 年前部署到 win2k12 时添加了这个
- TERMSRV/服务器名称
- TERMSRV/WebserverFqn
- WSMAN/WebServerFqn
- WSMAN/WebServer
- RestrictedKrbHost/WebServer
- 主机/网络服务器
- RestrictedKrbHost/WebServerFqn
- 主机/WebServerFqn
在网络服务器的委托选项卡上,它设置为
"Trust this computer for delegation to any service (Kerberos only)"
这是 IIS 身份验证部分的屏幕截图
-- 更新 4
这是在两种环境中访问网站后 Klist 信息的输出(我之前在工作站上进行了 klist 清除)
Windows 10 - 开发 - 工作
Cached Tickets: (4)
#0> Client: MyUser @ DomainFqn
Server: krbtgt/DomainFqn @ DomainFqn
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x60a00000 -> forwardable forwarded renewable pre_authent
Start Time: 11/28/2017 10:27:10 (local)
End Time: 11/28/2017 20:27:10 (local)
Renew Time: 12/5/2017 10:27:10 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0x2 -> DELEGATION
Kdc Called: DomainControllerFqn
#1> Client: MyUser @ DomainFqn
Server: krbtgt/DomainFqn @ DomainFqn
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40e00000 -> forwardable renewable initial pre_authent
Start Time: 11/28/2017 10:27:10 (local)
End Time: 11/28/2017 20:27:10 (local)
Renew Time: 12/5/2017 10:27:10 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0x1 -> PRIMARY
Kdc Called: DomainControllerFqn
#2> Client: MyUser @ DomainFqn
Server: cifs/resourceServer @ DomainFqn
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40a00000 -> forwardable renewable pre_authent
Start Time: 11/28/2017 10:27:11 (local)
End Time: 11/28/2017 20:27:10 (local)
Renew Time: 12/5/2017 10:27:10 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0
Kdc Called: DomainControllerFqn
#3> Client: admlareaua @ DomainFqn
Server: HTTP/webserverFQN @ DomainFqn
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40a40000 -> forwardable renewable pre_authent ok_as_delegate
Start Time: 11/28/2017 10:27:10 (local)
End Time: 11/28/2017 20:27:10 (local)
Renew Time: 12/5/2017 10:27:10 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0
Kdc Called: DomainControllerFqn
Windows 10 - 产品 - 不工作
#0> Client: MyUser @ DomainFqn
Server: krbtgt/DomainFqn @ DomainFqn
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40e00000 -> forwardable renewable initial pre_authent
Start Time: 11/28/2017 9:14:10 (local)
End Time: 11/28/2017 19:14:10 (local)
Renew Time: 12/5/2017 9:14:10 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0x1 -> PRIMARY
Kdc Called: DomainControllerFqn
#1> Client: admhqlareaua @ DomainFqn
Server: HTTP/WebServerFQN @ DomainFqn
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40a40000 -> forwardable renewable pre_authent ok_as_delegate
Start Time: 11/28/2017 9:14:10 (local)
End Time: 11/28/2017 19:14:10 (local)
Renew Time: 12/5/2017 9:14:10 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0
Kdc Called: DomainControllerFqn
Windows 7 - 生产型
Cached Tickets: (3)
#0> Client: MyUser @ DomainFqn
Server: krbtgt/DomainFqn @ DomainFqn
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x60a00000 -> forwardable forwarded renewable pre_authent
Start Time: 11/28/2017 9:17:24 (local)
End Time: 11/28/2017 19:17:24 (local)
Renew Time: 12/5/2017 9:17:24 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
#1> Client: MyUser @ DomainFqn
Server: krbtgt/DomainFqn @ DomainFqn
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40e00000 -> forwardable renewable initial pre_authent
Start Time: 11/28/2017 9:17:24 (local)
End Time: 11/28/2017 19:17:24 (local)
Renew Time: 12/5/2017 9:17:24 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
#2> Client: MyUser @ DomainFqn
Server: HTTP/WebServerFQN @ DomainFqn
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40a40000 -> forwardable renewable pre_authent ok_as_delegate
Start Time: 11/28/2017 9:17:24 (local)
End Time: 11/28/2017 19:17:24 (local)
Renew Time: 12/5/2017 9:17:24 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
更新 5 -
所以为了运行,我创建了一个快速的 mvc 站点并将其作为非工作站点的子站点。
我做了以下控制器。
public JsonResult GetList2()
{
var st = new List<string>();
var currSchema = ActiveDirectorySchema.GetCurrentSchema();
st.Add(currSchema.Name);
foreach (ActiveDirectorySchemaProperty property in currSchema.FindAllProperties())
{
st.Add($"{property.Name} - {property.RangeUpper}");
}
return Json(st, JsonRequestBehavior.AllowGet);
}
它似乎工作正常,并为我提供了我想要的 maxlength 值。所以我想我会在这个问题上认输,并继续重写应用程序的 c#。
更新 - 6(6 个月后)。
事实证明,问题出在凭据保护上。 (另一个旧应用程序开始出现相同类型的问题)
我们在注册表中关闭了凭据保护,应用程序运行良好。
(来自链接)
Kerberos 注意事项
启用 Windows Defender Credential Guard 后,您无法再 使用 Kerberos 无约束委派或 DES 加密。不受约束 委托可能允许攻击者从 孤立的 LSA 进程。使用受限或基于资源的 Kerberos 而是委托
所以我必须研究一下我猜是受限或基于资源的 Kerberos
【问题讨论】:
-
"服务器有 2 个从 URL 指向服务器的 spn。" 那么这两个 SPN 是什么?将其添加到您的问题中,并添加一个屏幕截图,显示您是如何委派的。
-
您好 T-Heron,我已为您添加了更多详细信息。一旦我从 Microsoft 获得更多信息,我将更新该主题。
-
我可能不需要等待微软,如果您可以为网络服务器添加委派选项卡的屏幕截图,显示该选项卡底部的“扩展”复选框已标记。那会很有帮助。
-
我已经添加了截图。当我选中展开的复选框时,屏幕截图中没有任何变化。这对于 dev 和 prod 都是一样的。
-
不,我已经从 keberos 高级人员调到了微软的 iis/asp.net 人员。一旦我有答案,我一定会更新
标签: asp.net windows active-directory kerberos gpo