ユーザーがコンシューマにログインしたときにサービスが実行されるサービスとコンシューマを理解し、設定するのに苦労しています。
私のコンシューマは MVC アプリケーションです。My Service は Web API アプリケーションです。どちらも同じドメイン内の別のサーバーで実行されます。どちらも Windows 認証を使用するように設定されています。
私の消費者コードは次のとおりです。
private T GenericGet<T>(string p)
{
T result = default(T);
HttpClientHandler handler = new HttpClientHandler() { PreAuthenticate = true, UseDefaultCredentials = true };
using (HttpClient client = new HttpClient(handler))
{
client.BaseAddress = new Uri(serviceEndPoint);
HttpResponseMessage response = client.GetAsync(p).Result;
if (response.IsSuccessStatusCode)
result = response.Content.ReadAsAsync<T>().Result;
}
return result;
}
私のサービスではUser.Identity.Name
、呼び出し元 ID を取得するために呼び出しますが、これは常に、ログインしているユーザーではなく、消費者のアプリ プール ID として返されます。コンシューマ アプリケーション プールはネットワーク サービスとして実行されており、サーバー自体は委任に対して信頼されています。では、ログインしたユーザーを取得するにはどうすればよいですか? サービスコード:
// GET: /Modules/5/Permissions/
[Authorize]
public ModulePermissionsDTO Get(int ModuleID)
{
Module module= moduleRepository.Find(ModuleID);
if (module== null)
throw new HttpResponseException(HttpStatusCode.NotFound);
// This just shows as the App Pool the MVC consumer is running as (Network Service).
IPrincipal loggedInUser = User;
// Do I need to do something with this instead?
string authHeader = HttpContext.Current.Request.Headers["Authorization"];
ModulePermissionsDTO dto = new ModulePermissionsDTO();
// Construct object here based on User...
return dto;
}
この質問によると、HttpClient は別のスレッドで実行されるため、このセットアップを機能させるには Kerberos が必要です。ただし、リクエストが Authorization ヘッダーを送信すると考えたため、サービスはこれを使用してユーザートークンを取得できるはずなので、これは私を混乱させます。とにかく、ここで「状況 5」のデモを使用して、これが私のドメインで正しく機能することを確認するために Kerberos でいくつかのテストを行いました。
では、これを機能させるにはどうすればよいでしょうか。Kerberos は必要ですか、それともサービスで Authorization ヘッダーをアンパックしてトークンからプリンシパル オブジェクトを作成する必要がありますか? すべてのアドバイスに感謝します。