2017-09-26 24 views
1

私は既存のmvc core 2.0 Webアプリケーションで使用するOpenIdDict authserverを設定しています。私はコードフローを使用しており、本番アプリケーションでOpenIdConnectの部分を実装する前にテスト用のmvc webappリソースサーバーを作成しています。OpenIddict MVCコア2.0とリソースサーバーAPIのJWT

すべてが意図したとおりに動作しているようで、ログインしてリソースにアクセスできます。

私は休憩クライアントの新しい認証アーキテクチャの下で動作するAPIベアラ認証を取得する必要があります。 Apiは同じリソースサーバーに配置されます。

私が使ってJWTのための私のOpenIddictを設定している:

  options.AllowPasswordFlow(); 
      options.UseJsonWebTokens(); 
      options.AddSigningKey(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("TokenAuthentication:SecretKey").Value))); 

は...

JwtBearer

 JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); 
     JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear(); 

     services.AddAuthentication() 
      .AddJwtBearer(options => 
      { 
       options.Authority = "http://localhost:17004/"; 
       options.Audience = "MyAudience"; 
       options.RequireHttpsMetadata = false; 
       options.TokenValidationParameters = new TokenValidationParameters 
       { 
        NameClaimType = OpenIdConnectConstants.Claims.Subject, 
        RoleClaimType = OpenIdConnectConstants.Claims.Role, 
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("TokenAuthentication:SecretKey").Value)) 
       }; 
      }); 
追加...とパスワードの流れトークンのリクエストを処理するためAuthorizationController.Exchangeにコードを追加しました。

私のリソースサーバーStartup.cs上でAddOpenIdConnectを追加し、signingKey(認証サーバーと同じキー)を追加しました。私のリソースサーバがまだ認証を行うことができ、これを設定すると、すべてが働いていると私は私の認証サーバからJWTトークンを取得するためにrestclientを使用することができますが、リソースサーバー上の私のAPIにアクセスしようとすると、それが原因でそこに失敗した後

  options.ResponseType = OpenIdConnectResponseType.Code; 
      options.AuthenticationMethod = OpenIdConnectRedirectBehavior.RedirectGet; 
      options.TokenValidationParameters = new TokenValidationParameters() 
      { 
       IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("TokenAuthentication:SecretKey").Value)) 
      }; 
      options.Authority = "http://localhost:17004/"; 

ベアラ方式のバリデータはありません。

TokenValidationParametersに同じsigningKeyを持つリソースサーバーでAddBearerTokenを呼び出すための呼び出しを追加すると、実際に動作します。挑戦は成功し、私は自分のリソースにアクセスできます。

私は私のapiを呼び出すとき、私のトークンの検証は、リソースサーバー上で起こっているので、私は2つの質問が残っていることがわかるので、私のセットアップは矛盾していると思う。

  1. JwtBearerミドルウェアが認証サーバーに認証を転送することは可能ですか? (openidConnectで処理できますか?)

  2. リソースサーバーの転送/パススルートークンの発行リクエストも自分の認証サーバーにすることは可能ですか?残りのAPIクライアントは2台のサーバーを処理する必要はありませんか?

答えて

1

JwtBearerミドルウェアが認証サーバーに認証を転送することは可能ですか? (openidConnectで処理できますか?)

JWTベアラミドルウェアは、OpenIddictの設定エンドポイントから取得した署名鍵を使用して、常にローカル検証を実行します。このタスクをOpenIddictに委任することはできません。

は私のREST APIクライアントが文句を言わない2台のサーバに対処する必要がありますので、あまりにも私の認証サーバ前進/パススルートークン発行要求を自分のリソースサーバを作成することが可能ですか?

トークン検証部分を認可サーバーに委任する場合は、JWTミドルウェアを使用しないでください。 OpenIddictオプションでイントロスペクションを有効にし、新しい機密クライアントアプリケーション登録を作成し、バックチャネルHTTPコールを使用して着信トークンを検証するaspnet-contrib introspection middlewareを使用します。

+0

OpenIddict認証サーバーに証明書を追加した後、jwksが動作し、リソースサーバー側からキーを取得でき、リソースサーバー上で検証が行われることを理解しています(恐れているsigningkeysの複数の登録でした)。しかし、私のRESTクライアントアプリは、最初のトークン発行のために認証サーバーに直接連絡する必要があります。私は自分のリソースサーバーを介してそれを行うことができますか? –

+0

...私の場合は、私のリソースサーバーでOpenIdConnectを使用すべきではないと述べました。 JwtBearerだけを使ってリソースサーバを設定する方法の例を挙げてください。 (openidconnectを削除すると、openidconnectスキームのハンドラが存在しないので、auth.controllerのチャレンジは失敗します。スキーマを「Bearer」に変更すると、認証サーバには連絡せず、401だけを返します) –

+0

私は小さなディスカバリメソッドを作成しました。私のRESTクライアントに権限を見つける場所を伝え、認証サーバーで.well-known/openid-configurationを使用してトークンエンドポイントを見つけます。 –

0

JWTはトークン形式であり、OpenIdConnectに必要です。 JWTを含むOauth2で任意のトークン形式を使用できます。だから、JWTをスキップする必要はありません。

+0

あなたが書いた言葉が私に意味を持たないので、私はいくつかの基本を理解することに問題があると思います。私は、どのフローの一部か、どのテクノロジーがどこで使われているかを調べるのに多くの時間を費やしてきました。そして、mvc core 2.0の設定方法とoidの実装方法を見つけること間違いです。 –

+0

私はこれに関する記事を書いており、これらの概念の概要があります。リンクはこちら - https://www.linkedin.com/pulse/microservices-security-openid-connect-manish-singh – ManishSingh

+0

良い記事。私はまた、私は今すぐ右のものを尋ねることができるので、私のMVCのセットアップについていくつかの詳細を見つけて、私の質問を編集しました。 –

関連する問題