繁体   English   中英

使用经过身份验证的用户凭据从asp.net启动控制台应用程序

[英]Starting a console application from asp.net using authenticated user credentials

我具有以下异步控制器操作,这些操作使我可以在远程服务器上启动控制台应用程序。 我的问题是关于权限和身份验证。 我尝试了以下方法,据我所知,该app.Start(valuationDate)允许app.Start(valuationDate)以模拟用户身份运行 原因是控制台应用程序需要访问网络资源,并且此Web应用程序的用户将具有所需的访问权限。 (请注意,控制台应用程序按计划任务运行,没有错误)

我怀疑的问题是,控制台应用程序仍在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 */}

    }

如果您使用的是Windows身份验证,并且您要运行的应用程序位于远程服务器上,则需要委派而不是模拟:

要访问网络资源,您需要委托级令牌。 要获取此令牌类型,需要将您的服务器配置为受信任,以便在Active Directory中进行委派。

您也可以签出以下KB 关于MSDN的一篇文章

另一种可能性是拥有一些将始终用于运行控制台应用程序的通用帐户。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM