2017-06-11 15 views
5

IdentityServer4をドッカーで設定しようとしていますが、動作させることができません。始めるために、私はアイデンティティサーバーのマニュアルのクライアント資格の例を取っ​​:Protecting an API using Client CredentialsIdentity Server 4とドッカー

IdentityServer
Configureではポート5001

にホストされているポート5000

WEBAPI
にホストされています方法私のWebApiのStartup.csファイル私は次のことをしました(問題はおそらくここにあります):

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
     { 
      Authority = "http://web:5000",     
      RequireHttpsMetadata = false, 
      ApiName = "api1" 
     }); 

クライアント
とクライアント

// Everything is fine here... 
var disco = await DiscoveryClient.GetAsync("http://localhost:5000"); 
var tokenClient = new TokenClient(disco.TokenEndpoint, "client", "secret"); 
var tokenResponse = await tokenClient.RequestClientCredentialsAsync("api"); 

// This does not work 
var client = new HttpClient(); 
client.SetBearerToken(tokenResponse.AccessToken); 
var response = await client.GetAsync("http://localhost:5001/identity"); 

問題は私のWEBAPIにおそらくある:

1)私はローカルホストに権限を設定した場合:5000を、私は内部サーバーを取得しますエラー:「このコンフィグレーションでlocalhost:5000が不明なのでコンフィグレーションを取得できません:http://localhost:5000/.well-known/openid-configuration '」

2)権限をhttp://web:5000に設定すると、認証エラーが発生します。「発行者の検証に失敗しました。発行者: 'http://localhost:5000'。一致しませんでした:validationParameters.ValidIssuer: 'http://web:5000'またはvalidationParameters.ValidIssuers "も意味がありますが、権限名を変更することが可能かどうかわかりませんか?また、IdentityServerプロジェクトでIssuerUriを設定しようとしましたが、トン助ける

答えて

5

ネットワーク

あなたは2台の物理マシンがあるとしましょう:。。C1とC2を各マシンがドッキングウィンドウのホストである

C1は、認証コンテナを実行します

C2はWEBAPI containeを実行します。 r。

Authドッカーファイルでポート5000を公開すると、アドレスC1:5000は、WebApiコンテナ自体からC2 およびにアクセスできるようになります。あなたはDNSへのIPを好むかもしれませんが、それは重要ではありません。さらに、成功するGETリクエストをhttp://C1:5000/.well-known/openid-configurationにすることができるはずです。

これを実現するために直面​​する可能性のあるネットワークの問題はたくさんあります。たとえば、次のように What would prevent code running in a Docker container from connecting to a database on a separate server?

発行者検証

Issuer validation failed

あなたのクライアントの権限のURLは、認証のホスト名とは異なります。デフォルトでは、権限のURLはissuerのプロパティ値に等しくなければなりません(このプロパティはIdentity Serverの自動検出文書の応答にあります)。一定のissuer値を達成するために

services.AddIdentityServer(x => 
{ 
    x.IssuerUri = "foo"; 
}) 

:DEV環境のための定数にIssuerUriを設定する

GET http://127.0.0.1:6000/.well-known/openid-configuration -> "issuer": "http://127.0.0.1:6000" 
GET http://localhost:6000/.well-known/openid-configuration -> "issuer": "localhost:6000" 

試してみてください。

issuerプロパティの値は、クライアントのWeb要求に依存します。これは(IP、マシン名またはDNSを使用して)任意の有効なURLでアイデンティティ・サーバーを呼び出すことがallowes:

GET http://anything/.well-known/openid-configuration -> "issuer": "foo" 

DiscoveryClientissuer値を検証します。

FYI
DiscoveryClient.Policy.ValidateIssuerName = false; 

IssuerUriは、本番環境のためのis not recommendedを設定する:あなたがして無効にでき

public bool ValidateIssuerName(string issuer, string authority) 
{ 
    return string.Equals(issuer, authority, StringComparison.Ordinal); 
} 

:それは単純な等価comparisonだそう

IssuerUri Set the issuer name that will appear in the discovery document and the issued JWT tokens. It is recommended to not set this property, which infers the issuer name from the host name that is used by the clients.

+0

は私の最初の部分を壊しますクライアント:var disco = DiscoveryClient.GetAsync( "http:// localhost:5000");を待機します。エラー= "発行者名が権限と一致しません:foo" '私の編集を参照してください。 – Bidou

+0

@Bidouあなたは正しい行であると確信していますか? 'DiscoveryClient.GetAsync'はGET要求を行い、応答を解析します。発行者の名前が変更された後は、すべてのトークンを新しいトークンに置き換える必要があります。 –

+0

実際はちょっと疲れました。 'GetAsync'によって返された' DiscoveryResponse'を調べると、 'Raw'プロパティーにjsonレスポンスが設定されていることがわかります(' issuer'と 'tokenendpoint'がそこにあります)が、' Error'プロパティには上記の「発行者名が権限:fooと一致しません」というメッセージが表示されます。 TokenEndpointプロパティはnullです(未処理のjsonであっても)、次の行でこのプロパティを使用してTokenClientをインナランスするので、NullPointerExceptionが発生します。 – Bidou

関連する問題