【问题标题】:AspNetCore Azure AD Connect Callback URL is http, not httpsAspNetCore Azure AD Connect 回调 URL 是 http,而不是 https
【发布时间】:2018-08-30 15:30:30
【问题描述】:

我有一个 AspNet Core 2.0 应用程序,它使用 OpenIdConnect API 通过 Azure AD 授权用户。 Azure App Entry 的回调 uri 定义为 https://localhost:44369/signin-oidchttps://domain.tld/signin-oidc。当我使用 IIS Express 在 localhost 上部署我的应用程序时,一切正常,我可以正确地对用户进行身份验证。

当我将我的应用程序部署到将 Nginx 配置为反向代理的 Linux 系统时,应用程序身份验证不起作用。 Azure AD 显示以下错误消息:

AADSTS50011:回复地址“http://domain.tld/signin-oidc”确实 与为应用程序配置的回复地址不匹配。更多的 详细信息:未指定

显然,我的应用程序告诉 Azure AD 重定向回 http 地址,但 Azure AD 拒绝这样做(幸运的是)。我想问题是我的应用认为它使用 http,因为它在 http://localhost:5000/ 上侦听反向代理。

public void Configure(string name, OpenIdConnectOptions options)
{
    options.ClientId = _azureOptions.ClientId;
    options.Authority = $"{_azureOptions.Instance}{_azureOptions.TenantId}";
    options.UseTokenLifetime = true;
    options.CallbackPath = _azureOptions.CallbackPath;
    options.RequireHttpsMetadata = true;
}

这是我用来配置 OpenIdConnect 的代码。为 CallbackPath 指定绝对路径会导致异常。有没有其他方法可以告诉 OpenIdConnect 始终使用 https 作为 CallbackPath?

如果我的 Nginx 配置不正确,这是我的配置的一部分:

location / {
        # redirect to ASP.NET application
        proxy_pass         http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $http_host;
        proxy_cache_bypass $http_upgrade;
}

非常感谢任何帮助!

【问题讨论】:

  • 这是您要找的答案吗? stackoverflow.com/a/44907445
  • Azure B2C 也受此影响,当放置在指向 Linux 托管的 AspNet Core 2.1 应用程序的 Nginx 反向代理后面时。生成的回复 URL 是 HTTP 而不是 HTTPS。 Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler ...消息包含错误:'redirect_uri_mismatch',error_description:'AADB2C90006:请求中提供的重定向URI ...未为客户端ID注册

标签: nginx asp.net-core azure-active-directory openid


【解决方案1】:

我发现了一个链接问题,其中包含解决此问题的帖子。该帖子在app.UseAuthentication();之前指示了以下插入

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

    app.UseForwardedHeaders(fordwardedHeaderOptions);

将此与您的 Nginx 配置结合起来;它必须转发此信息:

        #
        # Proxy WEB
        #
        location / {
                proxy_pass http://<snip>;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection keep-alive;
                proxy_set_header Host $http_host;
                proxy_cache_bypass $http_upgrade;
                proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header   X-Forwarded-Proto $scheme;
        }

为了彻底,我已经尝试过转发标题信息,但无济于事。这两行就成功了:

fordwardedHeaderOptions.KnownNetworks.Clear();
fordwardedHeaderOptions.KnownProxies.Clear();

感谢 charlierlee over in this post

【讨论】:

猜你喜欢
  • 2019-02-27
  • 2020-11-15
  • 1970-01-01
  • 2013-02-28
  • 2023-04-01
  • 2011-05-03
  • 2016-01-29
  • 2020-03-23
  • 2013-01-26
相关资源
最近更新 更多