0

私はConsole AppとWeb API 2プロジェクトを持っていて、どちらも同じサーバー上で動作しています。ドメインアカウントを偽装しながらHttpClientを使用してWeb APIでRESTfulエンドポイントを呼び出すようにコンソールアプリケーションをセットアップしました。Windows認証のコンソールアプリケーションからWeb API呼び出しで偽装されたユーザーを渡すにはどうすればよいですか?

  Console.WriteLine("Setting up impersonator."); 
      using (new Impersonator(accountUsername, accountDomain, accountPwd)) 
      { 
       Console.WriteLine("Impersonator set up."); 

       HttpClientHandler handler = new HttpClientHandler(); 
       handler.UseDefaultCredentials = true; 

       Console.WriteLine("Executing as: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name); 

       using (var client = new HttpClient(handler)) 
       { 
        client.BaseAddress = new Uri(serviceBaseUrl); 
        client.DefaultRequestHeaders.Accept.Clear(); 
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

        HttpResponseMessage response = await client.GetAsync("api/resource/3/"); 
        Console.WriteLine(response.ToString()); 
        if (response.IsSuccessStatusCode) 
        { 
         result = await response.Content.ReadAsAsync<ResourceType>(); 
        } 
       } 

       if (result != null) 
       { 
        // Do something... 
       } 
      } 

HTTPリクエストはこの時点にそれを作ることはありませんように私は(でも任意の承認属性なし)、実際のエンドポイントは、この質問に関連しているとは思いません。 2つのプロジェクトをローカルで実行すると、Console Appは通話を成功させることができます。しかし、私はそれをサーバー上で実行すると、コンソールアプリケーションは無許可の401を受け取ります。 Web APIパイプラインにいくつかのログを追加して、HttpContext.Current.User情報を記録しました。

protected void Application_BeginRequest() 
    { 
     var currentContext = HttpContext.Current; 
     ILogHelper _logger = new LogHelper("System"); 

     _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "BeginRequest System Principal Name: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name); 
     _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "BeginRequest Is User Null? " + (currentContext.User == null? "YES":"NO")); 

     if (currentContext.User != null) 
     { 
      _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "BeginRequest User: " + currentContext.User.Identity.Name); 
      _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "BeginRequest User Authenticated: " + currentContext.User.Identity.IsAuthenticated.ToString()); 
     } 
    } 

    protected void Application_AuthenticateRequest() 
    { 
     var currentContext = HttpContext.Current; 
     ILogHelper _logger = new LogHelper("System"); 

     _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthenticateRequest System Principal Name: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name); 
     _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthenticateRequest Is User Null? " + (currentContext.User == null ? "YES" : "NO")); 

     if (currentContext.User != null) 
     { 
      _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthenticateRequest User: " + currentContext.User.Identity.Name); 
      _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthenticateRequest User Authenticated: " + currentContext.User.Identity.IsAuthenticated.ToString()); 
     } 
    } 

    protected void Application_AuthorizeRequest() 
    { 
     var currentContext = HttpContext.Current; 
     ILogHelper _logger = new LogHelper("System"); 

     _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthorizeRequest System Principal Name: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name); 
     _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthorizeRequest Is User Null? " + (currentContext.User == null ? "YES" : "NO")); 

     if (currentContext.User != null) 
     { 
      _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthorizeRequest User: " + currentContext.User.Identity.Name); 
      _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthorizeRequest User Authenticated: " + currentContext.User.Identity.IsAuthenticated.ToString()); 
     } 
    } 

ローカルで実行された場合、偽装されたユーザーは 'AuthenticateRequest'と 'AuthorizeRequest'に記録されます。しかし、サーバー上で実行された場合、ユーザーはパイプライン全体を通じてヌルです。

IISでWindows認証となりすましが有効になっています(それ以外はすべて無効になっています)。私はこれを40時間以上働いていて、何も進展していないように感じています。この問題の援助は膨大なものになるでしょう!

+0

クライアントとサーバーの両方が同じエンドポイントを使用していますか?クライアントの前にサーバーを起動しますか?接続は、1)送信元IP 2)宛先IP 3)ポート番号で構成されます。 3つの項目がすべて同じで、1つの接続しかできません。したがって、通常はサーバーが最初に起動し、IPAnyアドレスにポート番号で接続します。その後、クライアントはPCのIPアドレスに接続します。したがって、仮想接続は実際には2つの接続です。 IPAnyへのサーバーとIPへのクライアント。 PCは、IPへの送信がIPAnyにルーティングされるように設定されています。 – jdweng

+0

@jdweng「クライアントとサーバーの両方が同じエンドポイントを使用していますか?」という意味がわかりません。しかし、2番目の質問に答えるために、はい、Console APIがリクエストを行う前にWeb APIが実行されています。 –

+0

あなたのサーバーは次のようなWebページになり、ポート番号は(ブロックされていない)どのポート番号でもかまいません。すでにウェブページが稼働しているPCでサーバを稼働させている場合、デフォルトのポート番号8080を使用することはできません(同じポート番号で2つのアプリケーションを実行することになります)。 https://msdn.microsoft.com/en-us/library/system.net.httplistener(v=vs.100).aspx – jdweng

答えて

0

このSO questionから、私はそれが実際にFQDNの問題であると判断しました。 "修正"するには、Web.configの "localhost/service /"で "servername.com/service/"ベースURLを変更しなければなりませんでした。私がこれをしたら、それは完璧に走った。 localhostをURLとして使用するというのは気に入らないのですが、サーバのレジストリ値を編集できないので、fix provided by Microsoftは私にとっては役に立たないでしょう。

また、IISのWeb APIサイトで偽装を有効にする必要はありません。今、私はWindows認証のみを有効にしています。

関連する問題