2017-09-15 42 views
0

アクセストークンを要求するためにアイデンティティサーバー3のローカルインスタンスを指しているテストコンソールアプリケーションがあります。次のコードはこれを行い、(スコープ"scope.test.client"を1つ渡して)細かいトークンを返します。Identity Server 3を使用すると、ベアラトークン認証が成功した後でもClaimsPrinciple nullが返される

static TokenResponse GetClientToken(string clientId, string clientSecret, string[] scopes) 
    { 
     var uri = new Uri(string.Concat(ID_BASE_URI, ID_URL_TOKEN)); 

     var client = new TokenClient(
      uri.AbsoluteUri, 
      clientId, 
      clientSecret); 

     return client.RequestClientCredentialsAsync(string.Join(" ", scopes)).Result; 

次に、このトークンを使用してローカルで実行されているAPIを呼び出します。これは、上記で得られたTokenResponseを取り、このメソッドに渡さ:

static void CallApi(string url, TokenResponse response) 
    { 
     try 
     { 
      using (var client = new HttpClient()) 
      { 
       client.SetBearerToken(response.AccessToken); 
       Console.WriteLine(client.GetStringAsync(url).Result); 
      } 
     } 
     catch (Exception x) 
     { 
      Console.WriteLine(string.Format("Exception: {0}", x.Message)); 
     } 
    } 

API(ASP.NET WEBAPIプロジェクト)は、すべての要求に対するベアラトークン認証を強制するOwinスタートアップクラスを使用します。

 appBuilder.Map(baseApiUrl, inner => 
     { 
      inner.UseWebApi(GlobalConfiguration.Configuration); 

      // Enforce bearer token authentication for all API requests 
      inner.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions 
      { 
       Authority = "https://identityserver/core", 
       ValidationMode = ValidationMode.ValidationEndpoint, 

       RequiredScopes = new[] { "scope.test.client" } 
      }); 
     }); 
私の上書きの最初の行、

GlobalConfiguration.Configuration.Filters.Add(new DefaultApiAuthorizeAttribute()); 

このAPIのデバッグ:

また、すべてのAPIリクエストが属性を承認カスタムによって処理されることを保証します

var caller = actionContext.RequestContext.Principal as System.Security.Claims.ClaimsPrincipal; 

私はこの行でブレークした場合、私はactionContext.RequestContext.Principalは常にnullであることがわかります(DefaultApiAuthorizeAttribute中)方法がこれです。しかし、私は((System.Web.Http.Owin.OwinHttpRequestContext)actionContext.RequestContext).Request.Headersに私のコンソールアプリケーションから渡されたベアラトークンを持つAuthorizationヘッダーが含まれていることがわかります。

APIプロジェクトがベアラトークンを認証していないようです。確かに、アイデンティティ・サーバーのログには、最初のアクセス・トークンを発行した後にヒットしていないことが示唆されます。だから、なぜこれが起こっていないのか、少なくともどこを見るべきかについての専門家のアドバイスに感謝します。

SSLと何か関係があると思われます。 Identity ServerはSSLを必要としないように設定されており、署名にはidsrv3test.pfx開発証明書を使用しますが、どちらのサイトも自己署名SSL証明書でローカルにホストされています。私はローカルで正常に動作する同じIS3インスタンスに認証を委譲する別のテストMVC Webアプリケーションを持っているので、IS3インスタンスが正しく構成されていると信じています。

答えて

1

私は説明した影響を受ける可能性のある問題の範囲を想像しましたが、私の場合は、私の消費するAPIに診断ログを追加することで原因を見つけることができました。これは、問題がアセンブリの衝突であることを発見しました。 Owinミドルウェアはバージョン8.0.0.0のNewtonsoft.JSONアセンブリを探していましたが、私の消費するAPI(実際にはCMSの上で動作していました)は7.0.0.0を使用していました。高速な答えを見つけるのではなく、設定を微調整時間を過ごすことを望んでいる誰のために

は、ここにこのログを追加する方法について説明しますドキュメントです:https://identityserver.github.io/Documentation/docsv2/consuming/diagnostics.html

+0

Good find。何が起こっているか説明するために戻ってきてくれてありがとう。 –

1

あなたはUseWebApi呼び出す前UseIdentityServerBearerTokenAuthenticationを呼び出す必要があります。 OWINミドルウェアパイプラインを設定するときは、その順序が重要です。

あなたのケースでは、Web APIはIdentity Serverに送信される前に要求を処理します(まったく送信された場合)。

+0

ありがとうございました。しかし、これを解決しようとすると、私はすでに注文が重要だったので、この注文を切り替えることを実験したことをすでに読んでいたでしょう。その前に彼らはあなたが示唆した順序にありましたが、行動は同じでした。 – getsetcode

+0

トークンにローカル検証を使用できない理由はありますか? –

+0

その意味がわかりません、申し訳ありません。トークンはIS3によって発行されたので、IS3の検証が必要ですか? – getsetcode

関連する問題