2016-10-04 4 views
2

Ich habe zwei Identity Server und eine Web API. Was ich versuche zu tun, ist die API authentifizieren mit einem oder beiden der IdentityServer und in der Lage zu wechseln, wenn einer ausfällt. Wenn möglich, möchte ich auch einen neuen IdentityServer zur Laufzeit hinzufügen können.Best Practice für mehrere IdentityServer4-Dienste

Gibt es hier eine Best Practice?

Ab jetzt sieht es so aus.

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

Wenn ich die IdentityServer an Port 5000 herunterfahren kann ich nicht die API verwenden mehr. Was ist zu erwarten.

+0

Sie sollten lieber redundante Identity Server hinter einem Load Balancer haben. Dann würde das Netzwerk dafür sorgen. – leastprivilege

+0

Ich habe eine sehr einfache Middleware erstellt, die Aufrufe von localhost: 5000 an den korrekten Identityserver umleitet. Das funktioniert gut .. einmal (?). Danach geht er direkt zum Identitätsserver und ignoriert, was auch immer ich der Behörde vorschreibe. Aktualisiert er den Rechner während der Laufzeit? – Evelie

+0

Kann ich ihm irgendwie sagen, dass er die Behörde erneut versuchen soll, wenn einer der Anrufe abläuft? Selbst wenn ich jetzt einen korrekten Load Balancer implementiere, würde es immer noch dasselbe Verhalten haben, da der IdentityServer sagt, welche Adressen zu verwenden sind. So werden alle Anrufe nach dem ersten Load Balancer umgangen. Das macht mir nichts aus. Aber wenn es möglich ist, möchte ich es versuchen, wenn der IdentityServer ausfällt. Ab sofort stirbt die API mit dem IdentityServer, sogar mit einem Load Balancer. – Evelie

Antwort

0

Ich bin nicht sicher, ob dies ein guter Weg ist, um es zu lösen. Aber es ist ein Weg. Ich frage meinen Routing-Service nach dem "ersten Identitätsservice", um die Authroity in Optionen zu setzen. Und dann füge ich eine benutzerdefinierte IntrospectionBackChannelHandler

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

Da alle meine Identität Server gleich aussehen, sind aber auf unterschiedliche Adressen Ich nicht die Mühe haben, um wirklich wieder die Behörde zu tun.

In der benutzerdefinierten Introspect .... Ich überprüfe jedes Introspect und sende es an den "richtigen" Identityserver. Wenn es nicht funktioniert, versuche ich einen anderen Identityserver.

var qs = erwarten request.Content.ReadAsStringAsync(); var queryDic = QueryHelpers.ParseQuery (erwartet 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;