2011-12-02 71 views
0

基於ASP Classic,我有一個仍然很強大的遺留應用程序。爲了保護應用程序,我檢查登錄用戶是某個AD組的成員,並且返回一些有用的信息(例如全名,電子郵件地址等)。檢查用戶是給定廣告組(ASP Classic)的成員

這應該是相當常規的,幾年前,我從原來的方法(現在已經忘記)改爲現在的方法。實施起來有點煩瑣,因爲它跨越了許多我知之甚少的技術領域,但我的系統運行良好。

提示幾個服務器稍後移動(每一個都是重新實現系統的戰鬥),而且我不會面對另一個或三個移動。到目前爲止,我正在努力工作。我的代碼,我認爲仍然是健全的,但它是服務器配置是問題。權限,SETSPNs,Kerberos代表團等...

所以問題是,我該怎麼做才能做到這一點,或者,我還可以採取另一種方法。我的目標服務器是同一個AD域內的標準Server 2008和Server 2008 R2盒子。

我的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

添加了vbscript標籤,如果您需要面向AD的腳本代碼的幫助,VBScript是標籤。 – AnthonyWJones

回答

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「委託任意服務的信任計算」是一個非常糟糕的安全實踐。

+0

LDAP字符串(從oADSysInfo.UserName生成)是'LDAP:// CN = My Name,OU = IT,OU = HQ,DC = mydomain,DC = net',其中mydomain.net是本地AD域。據我所知,這是正確的 - 它在某些環境下肯定有效。 – CJM

+0

回覆:無約束的代表團,我明白你的觀點,但這是一個讓事情順利進行的例子。理想情況下,一旦找到解決方案,我應該收緊這一點,但在此之前... – CJM

+0

因此,DN返回在某些服務器上工作,但不是其他服務器? –

0

我導致此錯誤的情況是由於在服務帳戶的上下文中調用了ADSystemInfo.UserName方法。這是NetworkService(NT_AUTHORITY\NETWORK SERVICE)帳戶的帳戶,因此是本地帳戶,因此不在域中。我猜這就是爲什麼在我的情況下,我得到了ERROR_INVALID_DOMAINNAME

在我的情況下,第三方模塊沒有提供所需的用戶上下文,但更常見的是我認爲IIS身份驗證配置錯誤。