2016-06-24 1 views
0

Я пытаюсь найти решение, в котором одно веб-приложение обслуживает несколько доменов, для каждого домена я хотел бы настроить своих поставщиков, используя приложение идентификатор и секрет для внешнего поставщика, я хотел бы домен куков и информацию провайдеров для чтения из базы данных на основе текущего доменного имени, так, например:Поставщики Owin в веб-приложении с несколькими арендаторами, где у каждого домена есть свои собственные провайдеры

switch (currentDomainName) 
{ 
case "web1.com": load cookie domain and providers information for web1.com ... 
case "web2.com": load cookie domain and providers information for web2.com ... 
... 
} 

Я столкнулся две основные проблемы:

  1. У меня нет HttpContext, доступного в Owin Startup ConfigureAuth(), и я не уверен, как определить, какое доменное имя используется на раннем этапе запуска ...
  2. Я понимаю, что запуск запускается только один раз для каждого веб-приложения, поэтому для Например, после того, как web1.com будет доступен в первый раз, ConfigureAuth() не будет снова запущен для web2.com, если он уже установлен web1.com

Мне интересно, могу ли я переопределить некоторые методы Owin и сделать это не статично ... или, может быть, найти способ реализовать это по-другому (но я все еще люблю использовать Owin)

Где я могу т?

+0

провайдеры не построены для этого. Сколько доменов вы рассматриваете? Если это всего лишь несколько, вы можете разветвить конвейер для каждого домена, используя что-то вроде MapWhen, и предоставить для них различное промежуточное ПО. Трюк снова объединяет трубопровод. – Tratcher

+0

Около 10 доменов, но, возможно, больше в будущем, знаете ли вы о каком-либо другом промежуточном программном обеспечении, в которое я должен заглянуть? – Yovav

+0

Нет, это еще не так много развитой области. В определенный момент это слишком сложно для управления внутри вашего приложения, и вы обрабатываете его до службы, такой как Azure AAC B2C https://azure.microsoft.com/en-us/services/active-directory-b2c/ – Tratcher

ответ

0

Вы можете получить URL-адрес запроса, а затем выполнить поиск в базе данных, чтобы узнать, что является клиентом, связанным с доменом. Там может быть таблица, в которой перечислены поставщиков удостоверений для этого домена

Пример

TenantDomains 
************* 
TenantId  URL ...... 
tenant1  https://tenant1.company.com 
tenant2  https://tenant2.company.com 

IdProviders 
*********** 
TenantId  ProviderIds  ...... 
tenant1  Custom, Social 
tenant2  Social 

Здесь имена используются вместо идентификаторов для удобства чтения. Однако подход по-прежнему остается неизменным.

Вы можете выполнить все описанное выше в промежуточном программном обеспечении, а затем использовать значение в Environment, а затем настроить конвейер на основе данных или принятых ранее решений.

Пример:

Вы можете получить доступ входящего запроса от контекста Owin и делать все операции, которые сделали бы иначе на HttpRequest из самой просьбы Owin контекста в.

 app.MapWhen(req => req.Request.Headers.ContainsKey("Authorization"), apiAuth => 
     { 
      // do anything that matches this request 
      apiAuth.UseBearerAuthentication(new BearerAuthenticationOptions()); 

     }); 

НТН

+0

К сожалению, HttpRequest недоступен в Startup, и по этой причине нет способа определить URL-адрес так рано в конвейере, я думаю, что есть способ обновить файл cookie позже когда запрос доступен, но я не думаю, что поставщики Owin могут быть добавлены или обновлены позже, так что кажется, что это не получится. – Yovav

+0

предоставил примеры для доступа к запросу в конвейере OWIN , @Yovav: пожалуйста, обратитесь к образцу, отредактированному в вышеуказанном сообщении. – Saravanan

Смежные вопросы