Как разделить приложение IdentityServer4 MVC на интерфейс UI / API и интерфейс API для безопасного хостинга в DMZ? - PullRequest
0 голосов
/ 28 июня 2019

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

Из документации IdentityServer4 и некоторых других публикаций кажется, что это должно бытьможно разместить страницы входа MVC в DMZ и оставить IdentityServer4 API за брандмауэром.Если я правильно понимаю, я могу добиться этого с помощью настроек LoginUrl, LogoutUrl, ConsentUrl, ErrorUrl, DeviceVerificationUrl.

Однако я не уверен насчет API OpenID.Моим приложениям SPA потребуются не только страницы входа в систему, но и доступ к конечным точкам OpenID (подключение / авторизация, подключение / userinfo, подключение / проверка .well-known / openid-configuration).

Как мнезащищать эти конечные точки IdentityServer4 в DMZ безопасно?

В настоящее время я не знаю, как эти конечные точки OpenID создаются IdentityServer4.В моем коде запуска приложения я просто вызываю AddIdentityServer и UseIdentityServer, и это делает чудо, регистрируя конечные точки в моем приложении MVC и затем обрабатывая всю логику аутентификации где-то глубоко внутри IdentityServer4.

Очевидно,если я хочу отделить бэкэнд IdentityServer4, я должен вызвать AddIdentityServer и UseIdentityServer в коде своего веб-сервиса API бэкэнда, верно?Я не могу использовать эти вызовы методов на своем интерфейсном веб-сайте в DMZ, потому что тогда IdentityServer4 попытается подключиться к базе данных для данных OpenID, но база данных находится за брандмауэром и недоступна непосредственно из DMZ.

У меня есть следующий типичный код для инициализации IdentityServer4:

services.AddIdentityServer(
            options =>
            {
                ...
            })
            .AddConfigurationStore(options =>
            {
                options.ConfigureDbContext = b => b.UseSqlServer(Configuration.GetConnectionString("IdsvConnection"));
   ...
            })
            // this adds the operational data from DB (codes, tokens, consents)
            .AddOperationalStore(options =>
            {
                options.ConfigureDbContext = b => b.UseSqlServer(Configuration.GetConnectionString("IdsvConnection"));
   ...
            })
            .AddAspNetIdentity<ApplicationUser>();

Но если я оставлю этот код в front-end, IdentityServer4 не будет работать.Есть ли какой-нибудь способ настроить какой-либо другой вид доступа к базе данных хранилища операционных и конфигурационных данных через API бэкэнда?

Моя текущая инфраструктура IdentityServer4 выглядит следующим образом:

SPA APP, 
mobile apps
     |
     |
MVC app 
with login pages 
and IdentityServer4 OpenID endpoint
     |
     |
SQL server 
with IdentityServer4 config 
and operational stores

, но мне нужно это так:

SPA APP, 
mobile apps
     |
     |
--- DMZ ---
MVC app 
with login pages 
and IdentityServer4 OpenID endpoint
     |
     |
--- firewall ---
API web service                                
     |
     |
SQL server 
with IdentityServer4 config 
and operational stores

1 Ответ

1 голос
/ 15 июля 2019

Общее требование на самом деле, а не о кодировании.Речь идет о том, чтобы гарантировать, что, если DMZ будет скомпрометирован, другие уровни не будут.Стандартное решение - использовать обратный прокси-сервер перед сервером авторизации (IdentityServer в вашем случае).Это гарантирует, что пользовательские интерфейсы могут по-прежнему достигать конечных точек OAuth - но если скомпрометирована инфраструктура DMZ, злоумышленник не сможет получить доступ к серверу авторизации и его соединениям с базой данных.Надеюсь, это поможет ..

...