Как использовать олицетворение для доступа к сетевому ресурсу из IIS? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть приложение WebApi, которому нужно получить доступ к сетевому ресурсу на другом компьютере и открыть файлы Crystal Reports.

Я использую LogonUser и WindowsIdentity.Impersonate, чтобы выдавать себя за пользователя, который имеет права наобщий сетевой ресурс с использованием этого кода (не полный):

SafeTokenHandle safeTokenHandle;

const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_INTERACTIVE = 2;

bool returnValue = LogonUser(userName, domainName, userPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out safeTokenHandle);

if (returnValue == false)
{
    int ret = Marshal.GetLastWin32Error();
    throw new System.ComponentModel.Win32Exception(ret);
}

using (safeTokenHandle)
using (var newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle()))
using (var impersonatedUser = newId.Impersonate())
{ 
    actionToExecute();
}

Это прекрасно работает, например, при выводе списка папок или удалении файлов с использованием управляемого кода (System.IO).Однако мне нужно открыть файлы Crystal Reports (у меня последняя версия), и при этом я получаю исключение:

Доступ запрещен

Я предполагаю, чтоCR пытается загрузить файл в контексте пользователя пула приложений.

Я бы, вероятно, заработал, если бы я изменил пользователя пула приложений на пользователя домена с достаточными правами на сетевом ресурсе.Но я хочу избежать этого решения.

Будет ли использовать новую справку WindowsIdentity.RunImpersonated для .NET4.6, или она будет иметь такой же результат.Если да, есть ли способ заставить CR работать в предоставленном пользовательском контексте вместо пользователя пула приложений / домена приложения?

ОБНОВЛЕНИЕ

У меня было частичноедобиться успеха, изменив параметры LogonUser на LOGON32_LOGON_NEW_CREDENTIALS и LOGON32_PROVIDER_WINNT50.Затем я протестировал следующее:

  1. Запустил проект локально из VS2017 (чтобы проект WebApi работал в локальном контексте IIS Express) и получил доступ к сетевому ресурсу с помощью клиентского приложения на моем компьютере.машина.Этот тест прошел успешно.

  2. Опубликован проект WebApi на IIS на отдельной машине.Запустил клиентский проект (ClickOnce) на моем компьютере и получил доступ к тому же сетевому ресурсу.Этот тест не пройден.

  3. То же, что (2), но клиент опубликован и установлен на другом компьютере, и доступ к нему осуществляется с помощью сервера терминалов.Этот тест не пройден.

Почему первый тест проходит успешно, а тесты 2 и 3 - неудачные?Какими должны быть правильные параметры входа в систему, если поставляемые параметры не всегда будут работать?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Проблема в том, что ReportDocument не имеет что-то вроде LoadImpersonate, поэтому он всегда будет пытаться открыть файл .rpt, используя разрешения пула приложений.

Вам нужно делегирование, а не олицетворение,если вы используете проверку подлинности Windows и активный каталог, вам необходимо авторизовать ваш сервер и / или учетную запись пула приложений для делегирования ...

https://support.microsoft.com/en-us/help/810572/how-to-configure-an-asp-net-application-for-a-delegation-scenario

Таким образом, учетная запись пула приложенийбудет использовать привилегии пользователя для доступа к ресурсам

Если это невозможно, в качестве обходного пути вы можете использовать олицетворение, чтобы скопировать файл .rpt в доступное место для вашей учетной записи пула приложений и удалить егопосле использования ...

0 голосов
/ 11 февраля 2019

Возможно ли использовать встроенную олицетворение в ASP.NET?https://support.microsoft.com/en-ie/help/306158/how-to-implement-impersonation-in-an-asp-net-application

...