【问题标题】:Setup Identity Server 4 Reverse proxy设置 Identity Server 4 反向代理
【发布时间】:2018-10-01 21:09:13
【问题描述】:

编辑:更详细的解释

我们有以下设置:

  1. NGINX 反向代理设置为执行 SSL 卸载。所有内部 通信通过 HTTP。重定向的设置就像 这个:

    proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Original-For $proxy_add_x_forwarded_for; proxy_set_header X-Original-Proto $scheme; proxy_cache_bypass $http_upgrade;

  2. IS4 在 app.UseIdentityServer 之前有以下设置

    var fordwardedHeaderOptions = new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto }; fordwardedHeaderOptions.KnownNetworks.Clear(); fordwardedHeaderOptions.KnownProxies.Clear(); app.UseForwardedHeaders(fordwardedHeaderOptions);

  3. 在客户端,RequireHttpsMetadata 被设置为 FALSE

  4. 在 IS4 端,所有客户端都配置为具有“RedirectUris”和“PostLogoutRedirectUris”的 HTTPS 地址。

  5. 在客户端 IdentityServerAuthenticationOptions 配置如下:

    new IdentityServerAuthenticationOptions { Authority = "https://[OAUTH_ADDRESS]", ApiName = "[API_NAME]", ApiSecret = "[API_SECRET]", RequireHttpsMetadata = false }

实际发生的情况是,当我们尝试访问我们在 IS4 中注册的客户端之一并且请求被重定向到 IS4 进行身份验证时,我们会看到“未经授权的客户端”消息屏幕。此外,在检查重定向请求的查询字符串后,我们可以看到返回 URL 是 HTTP 而不是 HTTPS。

请指教。

【问题讨论】:

  • 当 IS4 位于 HTTPS 前端(如 NGINX)的后面时,您不需要 HTTPS,让 NGINX 执行 SSL/TLS 卸载“终止”。众所周知的做法是为后端进行 ssl-offloading,以避免不必要的复杂性和性能降低,而不会影响安全。 MS Azure 应用了类似的架构师概念。更多:docs.microsoft.com/en-us/aspnet/core/publishing/…

标签: https asp.net-core identityserver4


【解决方案1】:

Identity Server 的发现端点的默认行为是使用该方案 (Http vs Https)来自向端点发出的请求。

由于您的身份服务器是使用 HTTP 访问的(因为它位于反向代理之后),它提供的端点信息也将使用 HTTP。

您可以通过导航到 http://[OAUTH_ADDRESS]/.well-known/openid-configuration 亲自查看此内容

最新版本的 Identity Server 包含一个源选项,允许您将基本 URL 强制为 HTTPS。使用如下:

services.AddIdentityServer(options =>
    {
        options.PublicOrigin = "https://[OAUTH_ADDRESS]";
    })

【讨论】:

  • 我们使用的是 1.5.2 版本,并且没有“PublicOrigin”属性。也许您指的是 >= 2 的版本,据我所知,它需要 .NET Core 2.0。我们目前所做的是: services.AddIdentityServer(options => { options.IssuerUri = "https://[OAUTH_ADDRESS]"; }) 但显然它不起作用。
  • 是的,它只是在 v2 中添加的。我目前正在自己​​将所有内容更新到 .net core 2,如果有任何大问题,我会通知您。到目前为止有什么阻止你吗?
  • 这在 Treafik 代理后面的 Identityserver4 上对我有用,谢谢。
【解决方案2】:

您的设置可能会有所不同,但如果您仍在使用身份服务器版本 RequireHeaderSymmetry = false 对我们很有效

var forwardOptions = new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto,
    RequireHeaderSymmetry = false
};

forwardOptions.KnownNetworks.Clear();
forwardOptions.KnownProxies.Clear();
app.UseForwardedHeaders(forwardOptions);

here 也讨论过这个问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-20
    • 2012-03-19
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    相关资源
    最近更新 更多