2016-10-04 4 views
2

У меня есть два идентификационных сервера и один веб-API. То, что я пытаюсь сделать, - это аутентификация API с одним или обоими IdentityServers и возможностью переключения, если он сходит. Если возможно, мне также хотелось бы добавить новый IdentityServer во время выполнения.Лучшая практика работы с несколькими службами IdentityServer4

Есть ли какая-либо передовая практика здесь?

На данный момент это выглядит так.

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

Если я отключу IdentityServer на порту 5000, я больше не могу использовать API. Что и следовало ожидать.

+0

У вас должен быть избыточный идентификатор для балансировки нагрузки. Тогда сеть позаботится об этом. – leastprivilege

+0

Я сделал очень простое промежуточное программное обеспечение, которое перенаправляет вызовы localhost: 5000 на правильный идентификационный сервер. Это отлично работает .. один раз (?). После этого он направляется прямо к серверу идентификации и игнорирует все, что я установил для Управления. Обновляет ли он уровень хостов во время выполнения? – Evelie

+0

Могу ли я каким-то образом попросить его повторить полномочия, если один из звонков истечет? Даже если я реализую правильный балансировщик нагрузки, теперь он будет по-прежнему иметь такое же поведение, так как IdentityServer сообщает, какие адреса использовать ... поэтому все вызовы после начального будут перемещаться по балансировщику нагрузки. Я не против этого. Но если возможно, я хотел бы повторить попытку, если IdentityServer опустится. На данный момент API будет умирать с IdentityServer, даже с балансировщиком нагрузки. – Evelie

ответ

0

Im не уверен, что это хороший способ решить эту проблему. Но это один из способов. Я прошу услугу маршрутизации для «first identityservice», чтобы установить параметр «Автономность» в параметрах. А потом добавить пользовательские IntrospectionBackChannelHandler

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

Поскольку все мои серверы идентичности выглядят одинаково, но по разным адресам, я действительно не должны беспокоить, чтобы сделать Authority вещь снова.

Внутри пользовательского Introspect .... Я проверяю каждую интроспекцию и отправляю ее на «правильный» идентификационный сервер. Если он не работает, я попробую другой идентификационный сервер.

var qs = ожидание 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;