2011-03-09 1 views
1

다음과 같은 비동기 컨트롤러 작업을 통해 원격 서버에서 콘솔 응용 프로그램을 시작할 수 있습니다. 내 문제는 사용 권한과 인증에 관한 것입니다. 나는 다음을 시도했다 내 이해에 app.Start(valuationDate)이 가장 된 사용자으로 실행되도록 허용합니다. 그 이유는 콘솔 응용 프로그램이 네트워크 리소스에 액세스해야하고이 웹 응용 프로그램의 사용자에게 필요한 액세스 권한이 있어야하기 때문입니다. (콘솔 앱은 오류없이 예약 된 작업으로 실행됩니다.)인증 된 사용자 자격 증명을 사용하여 asp.net에서 콘솔 응용 프로그램 시작

콘솔 앱이 네트워크 리소스 "액세스 거부"오류를 발생시키는 IIS 앱 풀 ID로 계속 실행되는 것 같습니다. 콘솔 응용 프로그램 자체가 시작되지만 IIS 사용자 계정의 제한된 액세스로 인해 오류가 발생합니다.

인증 된 사용자로 실행되도록 AppPool ID를 변경하려고 시도했지만 프로세스가 올바르게 실행됩니다. 서버에서 AppPool ID를 변경하지 않아도되는 솔루션을 기대하고 있습니다.

인증 된 사용자 세부 정보를 사용하여 콘솔 응용 프로그램을 시작하려면 어떻게해야합니까?

컨트롤러 작업 :

[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

Windows 인증과 당신이 delegation 필요 원격 서버에있는 실행해야하는 응용 프로그램을 사용하는 경우 명의 도용이 아닙니다.

네트워크 리소스에 액세스하려면 위임 수준 토큰이 필요합니다. 이 토큰 유형을 얻으려면 Active Directory의 위임에 대해 서버가 을 신뢰할 수있는 서버로 구성해야합니다.

following KB도 체크 아웃 할 수 있습니다. 그리고 또 다른 article on MSDN.

또 다른 가능성은 콘솔 응용 프로그램을 실행하는 데 항상 사용되는 일반 계정을 갖는 것입니다.

+0

위임 외에 다른 방법이 있습니까? 아마도 프로그램 적 관점에서 볼 때? – Ahmad

+0

@Ahmad, 당신은 프로그래밍 방식으로 할 수 있지만 당신이 생각하지 않는 클라이언트의 암호를 알아야합니다. 암호를 모르면 위임을 설정해야합니다. 또 다른 가능성은 콘솔 응용 프로그램을 실행하는 데 항상 사용되는 일반 계정을 갖는 것입니다. –

+0

감사합니다. 다린, 생각만큼 많이. 도메인 acount/AppPool 조합을 사용하는 것이 가장 간단 할 것 같습니다. 위임 옵션을 테스트 하겠지만 IT 부서가 진도를 저해 할까봐 걱정합니다. – Ahmad