将OpenID Connect的回调路径设置为HTTPS。

24

我有一个托管在AWS上的.Net Core 3.1应用程序,它位于https负载均衡器后面。对外部世界来说,它是一个https站点,但对于AWS内部而言,在负载均衡器后面运行的是http。

由于这个原因,OpenID Connect中间件会重定向到HTTP路径而不是HTTPS。

是否有办法强制OpenId Connect使用https路径?

.AddOpenIdConnect("oidc", options =>
{
    var oauthConfig = Configuration.GetSection("OAuthConfiguration").Get<OAuthConfiguration>();

    options.Authority = oauthConfig.Authority;
    options.ClientId = oauthConfig.ClientId;
    options.ClientSecret = oauthConfig.ClientSecret;
    options.ResponseType = "code";
    options.GetClaimsFromUserInfoEndpoint = true;
    options.SaveTokens = true;
    options.CallbackPath = "/signin-oidc";
当授权请求被发起时,会生成这个重定向URI:"RedirectUri": "http://demo.mysite.com/signin-oidc"。我无法在CallbackPath中硬编码路径,因为我的应用程序是多租户的,URL根据路由不同而不同。

2
这个只有7个赞?大多数.NET Core HTTP网站在负载均衡器后面都可能存在这个问题。 - Luke Puplett
3个回答

16
您可以通过以下方式强制提供商将您的回调URL重写为HTTPS:
option.Events = new OpenIdConnectEvents()
            {
                OnRedirectToIdentityProvider = context =>
                {
                    var builder = new UriBuilder(context.ProtocolMessage.RedirectUri);
                    builder.Scheme = "https";
                    builder.Port = -1;
                    context.ProtocolMessage.RedirectUri = builder.ToString();
                    return Task.FromResult(0);
                }
}

1

重定向URI应该是HTTPS值:

在多租户方面,我会尽量避免干扰Open Id Connect登录过程,而是为所有用户使用相同的回调路径。这是标准行为,使用重定向URI中的通配符可能会创建安全漏洞。

不确定我是否完全理解了您与多租户相关的要求,因此如果这对您不起作用,请发布一些有关您想要它如何工作的进一步详细信息。

.Net Core具有可以覆盖的事件,例如此事件,如果需要在运行时计算重定向URI:

options.Events.OnRedirectToIdentityProvider = (context) =>
{
    context.ProtocolMessage.RedirectUri = <load balanced value>;
    await Task.FromResult(0);
}

1
谢谢您的回复,不幸的是,我的客户非常注重白标化,这也延伸到了他们挑剔的 URL。我的代码只需在 AWS 的 localhost:80 上进行监听,然后将路由 53 条目指向负载平衡器,以便他们可以选择自己的 URL。我成功说服了我的 DevOps 将 AWS 任务更新为 HTTPS 协议,这解决了问题。 - A. Hasemeyer

0

解决方案

这里的答案是插入中间件,假装所有请求都是通过 HTTPS 进行的。对我来说很有效。

ASP.NET 5 OAuth 重定向 URI 未使用 HTTPS


警告

以下代码无法正常工作。在部署时,它会导致“关联失败”错误,可能是因为URL被篡改了。


这是我网站的完整修复方案。请注意,我正在从配置文件中加载我的选项。

.AddGoogle(options =>
{
    this.Configuration.Bind("OAuth2:Providers:Google", options);

    options.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "sub", "string");

    options.Events.OnRedirectToAuthorizationEndpoint = MakeHttps;
})

重要的是,这个事件实际上执行了重定向,否则你会得到一个200 OK和一个空白页面。

private Task MakeHttps(RedirectContext<OAuthOptions> arg)
{
    // When behind a load balancer the redirect URL, which is configured as CallbackPath in the appsettings.json
    // is created as HTTP because the HTTPS request is terminated at the NLB and is forwarded in clear text.

    // The policy of most OAuth IDPs is to disallow clear HTTP redirect URLs.

    if (!arg.RedirectUri.Contains("redirect_uri=https", StringComparison.OrdinalIgnoreCase))
    {
        arg.RedirectUri = arg.RedirectUri.Replace("redirect_uri=http","redirect_uri=https", StringComparison.OrdinalIgnoreCase);
    }

    arg.HttpContext.Response.Redirect(arg.RedirectUri);

    return Task.CompletedTask;
}

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