2016-10-04 7 views
2

私は2つのIDサーバーと1つのWeb APIを持っています。 私がしようとしているのは、IdentityServersの一方または両方でAPIを認証し、ダウンした場合に切り替えることです。可能であれば、実行時に新しいIdentityServerを追加することもできます。複数のIdentityServer4サービスのベストプラクティス

ここにはベストプラクティスがありますか?

現在のところ、このようになります。

 app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
     { 
      Authority = $"http://localhost:5000", 
      ScopeName = "my.scope", 
      RequireHttpsMetadata = false, 
      ScopeSecret = "secret", 
     }); 

ポート5000でIdentityServerをシャットダウンすると、APIをもう使用できなくなります。どちらが期待されるのか。

+0

ロードバランサの背後に冗長なIDサーバーを置く必要があります。その後、ネットワークがそれを処理します。 – leastprivilege

+0

私は、localhost:5000の呼び出しを正しいidentityserverに再ルーティングする非常にシンプルなミドルウェアを作った。これは正常に動作します。一度(?)。その後、彼はアイデンティティ・サーバーに直接行き、私がオーソリティを設定したものは無視します。彼は実行時に機密情報を更新しますか? – Evelie

+0

コールのうちの1つがタイムアウトすると、何とか当局に再試行するように指示できますか?正しいロードバランサを実装しても、IdentityServerがどのアドレスを使用するかを指示するので、同じ動作をします。最初のロード後にすべてのコールがロードバランサを回るようになります。私はこれを気にしない。しかし、可能であれば、IdentityServerがダウンすると再試行したいと思います。現時点では、ロードバランサを使用していても、APIはIdentityServerで終了します。 – Evelie

答えて

0

これが解決する良い方法であるかどうかわかりません。しかしそれは一つの方法です。 私のルーティングサービスに "最初のアイデンティティサービス"があるかどうかを尋ねて、オプションのAuthroityを設定します。 そして、すべての私のアイデンティティ・サーバーが同じように見えるが、私は本当に再び当局のことを行うためにわざわざする必要はいけない別のアドレスにしているので、私はカスタムIntrospectionBackChannelHandler

 app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
     { 
      Authority = $"http://{v.Address}:{v.Port}", 
      IntrospectionBackChannelHandler = new CustomIntrospectionBackChannelHandler(consulService) 

を追加します。

カスタムIntrospectの中....私は各イントロビューをチェックして、「正しい」アイデンティティサーバーに送信します。それが動作しない場合、私は別のアイデンティティサーバーを試します。

var qs = await request.Content.ReadAsStringAsync(); var queryDic = QueryHelpers.ParseQuery(request.Content.ReadAsStringAsync()を待機します);

 var token = queryDic["token"]; 
     var client_id = queryDic["client_id"]; 
     var client_secret = queryDic["client_secret"]; 
     var iRequest = new IntrospectionRequest 
     { 
      ClientId = client_id, 
      ClientSecret = client_secret, 
      TokenTypeHint = "access_token", 
      Token = token 
     }; 

     IntrospectionResponse result = null; 

     var svc = await _Consul.GetService(OrbitServices.IdentityServer); 
     result = await TrySendAsync(iRequest, svc); 
     if (!result.IsActive && result.IsError) 
     { 
      svc = await _Consul.GetService(OrbitServices.IdentityServer, true); 
      result = await TrySendAsync(iRequest, svc); 
     } 

     var message = new HttpResponseMessage(HttpStatusCode.OK) 
     { 
      Content = new StringContent(result.Raw, Encoding.UTF8, "application/json") 
     }; 

     return message; 
関連する問題