如何在负载均衡器后配置UseCookieAuthentication

5

我正在配置一个使用OIDC认证的.netcore应用程序(由IdentityServer提供)。

我已经在我的StartUp中包含了以下代码

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationScheme = "Cookies",
    AutomaticAuthenticate = true,
    ExpireTimeSpan = TimeSpan.FromMinutes(60)
});

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
    AuthenticationScheme = "oidc",
    SignInScheme = "Cookies",

    Authority = "https://myauthority",
    ClientId = "myclient",
    CallbackPath = "/",
    ResponseType = "id_token token",
    Scope = { "openid", "profile", "email" },
});

该应用程序托管在AWS上,运行在ECS中的Docker中。 它在应用程序负载均衡器后面运行,监听https。

我发现,由于我的应用程序本身未使用https(因为https由负载均衡器终止),OIDC中间件在重定向到OIDC服务器时生成了一个不正确的返回URL-它生成的URL以http://开头。

返回URL由AuthenticationHandler基类中的BuildRedirectUri方法生成。 它只是使用接收请求时的协议 - 似乎没有任何办法覆盖此设置。

protected string BuildRedirectUri(string targetPath)
{
    return this.Request.Scheme + "://" + this.Request.Host + this.OriginalPathBase + targetPath;
}

鉴于似乎不可能配置中间件强制进行HTTP重定向,那么我还有哪些其他选项呢?

我应该编写一个“更高”的中间件组件来侦听重定向请求并修改协议吗?还是有更好的方法来解决这个问题?


你能解决这个问题吗?我遇到了同样的情况,正如你评论@davidg提供的答案时所说,添加中间件似乎没有任何效果。 - Kevin R.
2个回答

3
对我而言,仅添加ForwarededHeaders是不够的。我还需要清除网络和代理(如ASP.NET Core Docs repo中所述)。

并且要尽早在Configure中完成:

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

如果其他方法都失败了,您也可以使用https://leastprivilege.com/2017/10/09/new-in-identityserver4-v2-simplified-configuration-behind-load-balancers-or-reverse-proxies/发布的解决方案来避免所有这些。这也起作用(但不适用于我的多租户环境):
services.AddIdentityServer(options =>
            {
                ...
               options.PublicOrigin = "https://whatever.domain.com";
                ...
            })

3
当使用代理(例如将IIS放在Kestrel前面或者像您这样使用负载均衡器时),代理应该发送 X-Forwarded-ForX-Forwarded-Proto HTTP头。后一个传递请求的原始协议。幸运的是,有一个解决方法,那就是使用来自 Microsoft.AspNetCore.HttpOverrides 包的ForwardedHeaders 中间件。因此,请添加该包,然后将以下代码添加到中间件管道中:
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

请尽早将此代码放入您的流程中。

1
这似乎对 .net core OIDC 中间件没有任何影响。还有其他步骤吗? - TreeAndLeaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接