Доступ к общим ресурсам 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.

Установка значения "Доверять этот компьютер для делегирования какой-либо службе" не будет работать!

Другие вопросы по тегам