Проверка пользователя является членом данной группы AD (ASP Classic) - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть устаревшее приложение, основанное на 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)

Iнастроены имена участников-служб для пользователя домена следующим образом:

http/myServer
http/myServer.mydomain.net

Тем не менее, когда я запускаю приложение, мой код падает при первом вызове GetObject:

error '800704bc' 

Может ли кто-нибудь помочьраз и навсегда отладьте эту проблему или предоставьте альтернативу, если она есть.Конечно, я бы хотел перестроить в .NET, но это не вариант.

Ответы [ 2 ]

0 голосов
/ 25 июля 2012

Моя ситуация, которая привела к этой ошибке, была вызвана тем, что метод ADSystemInfo.UserName вызывался в контексте учетной записи службы.Это была учетная запись NetworkService (NT_AUTHORITY\NETWORK SERVICE) и, следовательно, локальная, а следовательно, не в домене.Я предполагаю, что именно поэтому в моем случае я получил ERROR_INVALID_DOMAINNAME.

. В моем случае сторонний модуль не предоставлял требуемый пользовательский контекст, но чаще я ожидал, что аутентификация IIS была неправильно настроена.

0 голосов
/ 03 декабря 2011

Ну, вот смысл вашей ошибки:

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 "доверительные вычисления для делегирования любому сервису", является очень плохой практикой безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...