私は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時間以上働いていて、何も進展していないように感じています。この問題の援助は膨大なものになるでしょう!
クライアントとサーバーの両方が同じエンドポイントを使用していますか?クライアントの前にサーバーを起動しますか?接続は、1)送信元IP 2)宛先IP 3)ポート番号で構成されます。 3つの項目がすべて同じで、1つの接続しかできません。したがって、通常はサーバーが最初に起動し、IPAnyアドレスにポート番号で接続します。その後、クライアントはPCのIPアドレスに接続します。したがって、仮想接続は実際には2つの接続です。 IPAnyへのサーバーとIPへのクライアント。 PCは、IPへの送信がIPAnyにルーティングされるように設定されています。 – jdweng
@jdweng「クライアントとサーバーの両方が同じエンドポイントを使用していますか?」という意味がわかりません。しかし、2番目の質問に答えるために、はい、Console APIがリクエストを行う前にWeb APIが実行されています。 –
あなたのサーバーは次のようなWebページになり、ポート番号は(ブロックされていない)どのポート番号でもかまいません。すでにウェブページが稼働しているPCでサーバを稼働させている場合、デフォルトのポート番号8080を使用することはできません(同じポート番号で2つのアプリケーションを実行することになります)。 https://msdn.microsoft.com/en-us/library/system.net.httplistener(v=vs.100).aspx – jdweng