Доступ к общим ресурсам Windows из кода в веб-приложении Base Athentication Base Share Claims
Я хочу получить доступ к общим ресурсам на другом компьютере из кода. Моя среда - веб-приложение Sharepoint 2010, работающее в режиме проверки подлинности на основе утверждений. Идентификацией Windows приложения является NT AUTHORITY\IUSR, а не пользователь, вошедший в систему, поэтому для доступа к ресурсам сетевого ресурса на другом компьютере мне необходимо выполнить олицетворение. Поскольку у меня нет действующего токена Windows для выполнения олицетворения, мне нужно использовать службу "Требования к токену Windows", которую я настроил для доступа NT AUTHORITY\IUSR. Служба работает как локальная системная учетная запись. Я могу получить маркер Windows уровня олицетворения от службы, которую я использую для выполнения олицетворения с использованием следующего кода:
using (wi = S4UClient.UpnLogon(upn))
{
using(WindowsImpersonationContext wic2 = wi.Impersonate())
{
//code to access windows shares
}
}
Служба правильно возвращает токен, и олицетворение успешно выполняется таким образом, что когда я возвращаю имя текущего пользователя, вошедшего в систему, используя следующий код:
WindowsIdentity.GetCurrent().Name;
Я получаю имя пользователя, вошедшего в систему sharepoint.
Проблема в том, что при попытке доступа к сетевым ресурсам возникает ошибка "отказано в доступе". Проблема заключается в том, что из-за олицетворения с помощью c2wts я предоставляю реальные учетные данные (логин и пароль) для олицетворения пользователя, используя следующий код:
[DllImport("advapi32.dll", SetLastError = true)]
private static extern Int32 LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, Int32 dwLogonType, Int32 dwLogonProvider, ref IntPtr phToken);
[DllImport("advapi32.dll", SetLastError = true)]
private static extern Int32 ImpersonateLoggedOnUser(IntPtr hToken);
private static IntPtr ImpersonateUser(string user, string domain, string password)
{
IntPtr lnToken = new IntPtr(0);
Int32 TResult = LogonUser(user, domain, password, LOGON32_LOGON_NETWORK_CLEARTEXT, LOGON32_PROVIDER_WINNT50, ref lnToken);
if (TResult > 0)
{
ImpersonateLoggedOnUser(lnToken);
}
return lnToken;
}
Я могу без проблем перечислять акции на сервере.
Из информации, которую я нашел в Интернете для правильной настройки службы для доступа к базе данных sql на другом сервере, мне нужно включить переход по протоколу и ограниченное делегирование в Active Directory и установить это ограничение для службы mysql. Тем не менее, я не уверен, как включить делегирование в этом случае, поскольку я пытаюсь добиться доступа к любому общему ресурсу на любом компьютере, если только у пользователя есть разрешения на это.
Подводя итог, я хочу выдать себя за пользователя изнутри веб-приложения аутентификации на основе утверждений Sharepoint для доступа к сетевым ресурсам на других компьютерах, но даже жесткая имитация с использованием c2wts кажется успешной (верное имя пользователя возвращается при проверке текущего имени пользователя). У меня нет доступа ресурсы на другом компьютере. С другой стороны, при олицетворении с использованием логина и пароля, предоставленных непосредственно в коде, все работает нормально, но это не вариант для меня.
1 ответ
Хорошо, мне действительно удалось это решить.
То, что я сделал, установило олицетворение в web.config моего веб-приложения на false:
<identity impersonate="false" />
В этом случае я смог увидеть файлы на локальных ресурсах. Чтобы включить доступ на других компьютерах, мне пришлось создать имя участника-службы (SPN) для учетной записи, под которой работало мое веб-приложение.
SETSPN -A HTTP/ServerName myDomain\webAppAccountUserName
SETSPN -A HTTP/FQDNServerName myDomain\webAppAccountUserName
и SPN для компьютера, на котором работало веб-приложение и c2wts (c2wts работает как LocalSystem)
SETSPN -A HOST/ServerName ServerName
SETSPN -A HOST/FQDNServerName ServerName
Следующим шагом является настройка ограниченного делегирования и перехода по протоколу, чтобы мы могли делегировать его в общий файловый ресурс на другом компьютере, для этого нам нужно открыть инструмент "Active Directory - пользователи и компьютеры" и настроить делегирование для учетной записи веб-приложения и учетной записи компьютера, на которой работает c2wts. на. В частности, нам нужно:
- выберите интересующую нас учетную запись, например учетную запись компьютера,
- щелкните правой кнопкой мыши,
- выберите свойства,
- выберите вкладку делегирования,
- выберите "Доверять этому компьютеру для делегирования только указанным сервисам" и "Использовать любой протокол аутентификации",
- добавить "общую файловую систему Интернета (cifs)" с компьютера, к которому мы хотим подключиться
Мы должны сделать то же самое для учетной записи webapp.
Установка значения "Доверять этот компьютер для делегирования какой-либо службе" не будет работать!