出于安全原因,我的客户坚持认为 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 端点的。在我的应用程序启动代码中,我只调用AddIdentityServer
and 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