2

出于安全原因,我的客户坚持认为 IdentityServer4 不应完全托管在 DMZ 中,尤其是考虑到它可以直接访问数据库服务器。

从 IdentityServer4 文档和其他一些帖子来看,似乎应该可以在 DMZ 中托管 MVC 登录页面并将 IdentityServer4 API 留在防火墙后面。如果我理解正确,我可以使用 LoginUrl、LogoutUrl、ConsentUrl、ErrorUrl、DeviceVerificationUrl 设置来实现这一点。

但是,我不确定 OpenID API。我的 SPA 应用程序不仅需要登录页面,还需要访问 OpenID 端点(connect/authorize、connect/userinfo、connect/checksession.well-known/openid-configuration)。

如何安全地在 DMZ 中公开那些 IdentityServer4 端点?

目前我不知道 IdentityServer4 是如何创建这些 OpenID 端点的。在我的应用程序启动代码中,我只调用AddIdentityServerand UseIdentityServer,它确实很神奇,将端点注册到我的 MVC 应用程序,然后在 IdentityServer4 深处的某个地方处理所有身份验证逻辑。

显然,如果我想分离 IdentityServer4 后端,我应该在我的后端 API Web 服务代码中调用AddIdentityServer和,对吗?UseIdentityServer我无法在 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>();

但是如果我把这段代码留在前端,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
4

1 回答 1

1

实际上是一个共同的要求,而不是关于编码。这是为了确保如果 DMZ 受到损害,其他层不会受到损害。标准解决方案是在授权服务器(在您的情况下为 IdentityServer)前面使用反向代理。它确保 UI 仍然可以到达 OAuth 端点——但是如果 DMZ 基础设施受到破坏,攻击者将无法获得实际的授权服务器及其数据库连接。

于 2019-07-15T19:06:18.613 回答