Запуск консольного приложения с asp.net с использованием аутентифицированных учетных данных пользователя - PullRequest
1 голос
/ 09 марта 2011

У меня есть следующие асинхронные действия контроллера, которые позволяют мне запускать консольное приложение на удаленном сервере.Моя проблема связана с разрешениями и аутентификацией.Я попробовал следующее, , которое, в моем понимании, позволяет app.Start(valuationDate) работать от имени другого пользователя .Причина этого заключается в том, что консольному приложению требуется доступ к сетевым ресурсам, а пользователь этого веб-приложения будет иметь необходимые права доступа.(Как примечание: консольное приложение выполняется как запланированная задача без ошибок)

Проблема, которую я подозреваю, состоит в том, что консольное приложение все еще выполняется под идентификатором пула приложений IIS, что вызывает ошибки сетевого ресурса «Отказано в доступе»,Само консольное приложение запускается, но ограниченный доступ к учетной записи пользователя IIS вызывает сбой.

Я попытался изменить удостоверение AppPool для запуска в качестве авторизованного пользователя, и процесс выполняется правильно.Я надеюсь на решение, которое не потребует от меня изменения удостоверения AppPool на сервере.

Как мне запустить консольное приложение, используя данные аутентифицированных пользователей?

Действия контроллера:

[HttpPost]
public void RunAsync(DateTime valuationDate)
{
    AsyncManager.OutstandingOperations.Increment();
    Task.Factory.StartNew(() => RunApp(valuationDate));
}

private void RunApp(DateTime valuationDate)
    {
        ConsoleWrapper app = new ConsoleWrapper();
        WindowsIdentity winId = (WindowsIdentity)HttpContext.User.Identity;           
        WindowsImpersonationContext ctx = null;
        try
        {
            ctx = winId.Impersonate();
            app.Start(valuationDate);
        }
        catch (Exception e)
        {
            throw;
        }
        finally
        {

            if (ctx != null) {ctx.Undo();}

        }
        AsyncManager.Parameters["success"] = app.Success();
        AsyncManager.Parameters["message"] = app.Message();
        AsyncManager.OutstandingOperations.Decrement();
    }

ConsoleWrapper:

public void Start(DateTime valuationDate)
    {
        var appExe = Config.Default.CONSOLE_APP;
        InProgress = true;
        log = String.Empty;
        success = false;
        message = String.Empty;

        try
        {
            var process = new Process();
            process.StartInfo.FileName = appExe;
            process.StartInfo.Arguments = valuationDate.ToString("dd-MMM-yyyy");

            process.EnableRaisingEvents = true;

            process.StartInfo.UseShellExecute = true;
            process.StartInfo.RedirectStandardOutput = true;

            process.Exited += new EventHandler(process_Exited);
            process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
            process.Start();
            process.WaitForExit();

        }
        catch (Exception e){/* snip */}

    }

1 Ответ

1 голос
/ 09 марта 2011

Если вы используете проверку подлинности Windows и приложение, которое вы пытаетесь запустить, находится на удаленном сервере, вам нужно делегирование , а не олицетворение:

Для доступа к сетевому ресурсу вы необходимо делегировать токен уровня. Получить этот тип токена, ваш сервер должен быть настроенным как доверенный для делегирование в Active Directory.

Вы также можете оформить заказ после KB . И еще одна статья на MSDN .

Еще одна возможность - иметь общую учетную запись, которая всегда будет использоваться для запуска консольного приложения.

...