AspNetCore Azure AD Connect回调URL是http,而不是https

Hoo*_*iii 8 openid nginx azure-active-directory asp.net-core

我有一个AspNet Core 2.0应用程序,该应用程序使用OpenIdConnect API授权用户使用Azure AD。Azure应用程序条目的回调uris定义为https:// localhost:44369 / signin-oidchttps://domain.tld/signin-oidc。当我使用IIS Express在本地主机上部署应用程序时,一切正常,并且我可以正确地验证用户身份。

当我将应用程序部署到具有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;
}
Run Code Online (Sandbox Code Playgroud)

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

如果我的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;
}
Run Code Online (Sandbox Code Playgroud)

任何帮助深表感谢!

Mik*_*ike 8

我找到了一个帖子的链接问题,该帖子解决了这个问题。该帖子指示以下插入之前app.UseAuthentication();

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

    app.UseForwardedHeaders(fordwardedHeaderOptions);
Run Code Online (Sandbox Code Playgroud)

结合使用您的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;
        }
Run Code Online (Sandbox Code Playgroud)

确切地说,我已经尝试过转发标头信息,但无济于事。这两行达到了目的:

fordwardedHeaderOptions.KnownNetworks.Clear();
fordwardedHeaderOptions.KnownProxies.Clear();
Run Code Online (Sandbox Code Playgroud)

赞扬charlierlee 在这篇文章中