1

ここで明らかな何かが欠けている可能性があります。私は MVC と Web API の両方に慣れていないので、頭を水の上に保つことに取り組んでいます。

Web API サービスと連携する MVC アプリケーションがあります。認証は、社内で開発されたログイン サービスによって処理されます。作業中、MVC クライアントは現在のユーザーが認証されているかどうかを確認する必要があります。そうでない場合は、ユーザーを認証して現在のユーザーを更新することになっているこのログイン サービスにリダイレクトされます。次に、Web API サービスからこの ID にアクセスできる必要があります。

MVC アプリケーションの現在のプリンシパル (Thread.CurrentPrincipal または HTTPContext.Current.User を介して設定) が Web API サービスで利用可能であるという前提で動作していますが、サービスからアクセスしようとすると、プリンシパルが空です。次のすべてのオプションを使用してサービスからプリンシパルにアクセスしようとしましたが、常に空です:
RequestContext.Principal
User.Identity
HttpContext.Current.User
Thread.CurrentPrincipal

コードの基本的な考え方は 次のとおりです。

MVC Controller:
public ActionResult Index() {
   //Just create a test principal here to see if it's available in the service
   IPrincipal temp = new GenericPrincipal(new GenericIdentity("myUserName"), new string[]{});
   Thread.CurrentPrincipal = temp;

   using (var client = new HttpClient()) {
      client.BaseAddress = new Uri("myServiceAddress");
      HttpResponseMessage response = client.GetAsync("resourceString")).Result;
      ...Code to deal with result
   }
}



Web API Controller:
[HttpGet]
public HttpResponseMessage MyAction() {
   if (User.Identity == null || !User.Identity.IsAuthenticated) {
      //So sad
   } else {
      //Do some work
   }
}

どのようにアクセスしようとしても、現在のプリンシパルは常に空です。

4

1 に答える 1

5

スレッドとコンテキスト プリンシパルの両方を設定する必要があると思います。これが私がやっていることです:

private static void SetPrincipal(IPrincipal principal)
{
    Thread.CurrentPrincipal = principal;
    if (HttpContext.Current != null) {
        HttpContext.Current.User = principal;
    }
}

この記事の途中で、次のように書かれています。

アプリケーションがカスタム認証ロジックを実行する場合、次の 2 つの場所でプリンシパルを設定する必要があります。

  • Thread.CurrentPrincipal。このプロパティは、.NET でスレッドのプリンシパルを設定する標準的な方法です。
  • HttpContext.Current.User. このプロパティは ASP.NET に固有です。
于 2014-11-27T21:24:53.007 に答える