我有一个基于ASP Classic的遗留应用程序仍然很强大。为了保护应用程序,我正在检查登录用户是某个AD组的成员,我正在返回一些有用的信息(例如全名,电子邮件地址等)。
这应该是相当常规的,几年前,我从原来的方法(现在被遗忘)改为现在的方法。它实施起来有点繁琐,因为它跨越了一些我不太了解的技术领域,但我让系统工作正常。
稍后提示几个服务器移动(每个都是重新实施系统的战斗),我不会面临另一个或三个移动。到目前为止,我正努力让事情发挥作用。我的代码,我认为仍然是健全的,但问题是服务器配置。权限,SETSPN,Kerberos委派等......
所以问题是,我该怎么做才能做到这一点,或者我可以采取另一种方法。我的目标服务器是标准的Server 2008和Server 2008 R2,位于同一个AD域中。
我的ASP如下:
If Session("UID") = "" then
Dim oWshNetwork, oADSysInfo, oCurrentUser, sUserName, sComputerName
Dim sGroups
Set oWshNetwork = CreateObject("WScript.Network")
Set oADSysInfo = CreateObject("ADSystemInfo")
Set oCurrentUser = GetObject("LDAP://" & oADSysInfo.UserName)
Session("UID") = LCase(oWshNetwork.UserName)
Session("Name") = oCurrentUser.FullName
Session("Computer") = LCase(oWshNetwork.ComputerName)
Select Case VarType(oCurrentUser.MemberOf)
Case 8
sGroups = LCase(oCurrentUser.MemberOf)
Case 8204
sGroups = LCase(Join(oCurrentUser.MemberOf))
End Select
If InStr(1, sGroups, "myApp_Users",1) Then
Session("Auth") = 1
Else
Session("Auth") = 0
End If
If InStr(1, sGroups, "myApp_Admins",1) Then
Session("Admin") = 1
Else
Session("Admin") = 0
End If
Set oWshNetwork = nothing
Set oADSysInfo = nothing
Set oCurrentUser = nothing
End If
我在具有域用户身份的应用程序池中运行这些应用程序。
此域名用户已阅读&执行应用程序的权限。
为每个服务器启用Kerberos委派:
Trust the computer for delegation to any service (Kerberos only)
我为域用户配置了SPN,如下所示:
http/myServer
http/myServer.mydomain.net
然而,当我运行应用程序时,我的代码在第一次GetObject调用时失效:
error '800704bc'
任何人都可以帮助您一劳永逸地调试此问题,或者提供替代方案(如果有的话)。当然,我喜欢在.NET中重新开发,但这不是一种选择。
答案 0 :(得分:0)
嗯,这是你错误的意思:
C:\Users\BrianDesmond>err 0x800704bc
# as an HRESULT: Severity: FAILURE (1), FACILITY_WIN32 (0x7), Code 0x4bc
# for hex 0x4bc / decimal 1212
ERROR_INVALID_DOMAINNAME winerror.h
# The format of the specified domain name is invalid.
# 1 matches found for "0x800704bc"
考虑到这一点,是什么传递给第一个GetObject()
电话?
此外,无约束的委托,AKA“信任计算委托给任何服务”是一个非常糟糕的安全实践。
答案 1 :(得分:0)
导致此错误的情况是由于在服务帐户的上下文中调用了ADSystemInfo.UserName
方法。这是NetworkService(NT_AUTHORITY\NETWORK SERVICE
)帐户的帐户,因此是本地帐户,因此不在域中。我猜这就是为什么在我的情况下我得到了ERROR_INVALID_DOMAINNAME
。
就我而言,第三方模块没有提供所需的用户上下文,但更常见的是我希望IIS身份验证配置错误。