【发布时间】:2011-03-09 06:33:27
【问题描述】:
我有以下异步控制器操作,允许我在远程服务器上启动控制台应用程序。我的问题是关于权限和身份验证。我尝试了以下方法,据我了解,它允许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 */}
}
【问题讨论】:
标签: c# asp.net asp.net-mvc-3 console-application