设置Identity Server 4反向代理

时间:2017-10-16 14:06:33

标签: https asp.net-core identityserver4

编辑:更详细的解释

我们有以下设置:

  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"。

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

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

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

    请告知。

2 个答案:

答案 0 :(得分:2)

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

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

您可以通过导航到http://[OAUTH_ADDRESS]/.well-known/openid-configuration

自行查看

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

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

答案 1 :(得分:0)

您的设置可能会有所不同,但是如果您仍然使用身份服务器版本<2,我记得设置RequireHeaderSymmetry = false对我们来说效果很好

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

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

该问题也在here中进行了讨论