繁体   English   中英

.Net Core 2.0 - Azure Active Directory - NGinX反向代理 - HTTPS

[英].Net Core 2.0 - Azure Active Directory - NGinX reverse Proxy - HTTPS

我有一个.NET Core 2.0网站,在Linux上运行,侦听端口5000,在NGinX反向代理后面,它正在侦听端口80和442.NingXX配置为将HTTP流量重定向到HTTPS,并处理通过HTTPS的所有通信。 NGinx反向代理和Asp.Net核心应用程序位于共享网络上的自己的docker容器中。

此设置目前正如所述工作。

但是,我现在想要针对Azure Active Directory验证我的用户。 我遇到了一个问题,不知道从哪里开始。

首先,让我告诉你我如何配置大部分,然后我将解释我的错误。

NGinx(nginx.conf)

worker_processes 2;

events { worker_connections 1024; }

http {
    sendfile on;

    upstream docker-dotnet {
        server mycomp_prod:5000;
    }

    server {
            listen 80;
            server_name sales.mycompany.com;
            return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl;
        server_name sales.mycompany.com;
        ssl_certificate     /etc/nginx/ssl/combined.crt;
        ssl_certificate_key /etc/nginx/ssl/salesmycompany.key;

        location / {
            proxy_pass         http://docker-dotnet;
            proxy_redirect     off;
            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-Host $server_name;
        }
    }

}

Dotnet:Startup.cs ConfigureServices()

services.AddAuthentication(sharedOptions =>
{
     sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
     sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddAzureAd(options => Configuration.Bind("AzureAd", options))
.AddCookie();

Dotnet:Startup.cs Configure()

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
app.UseAuthentication();

Dotnet:appsettings.json

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "mycompany.com",
    "TenantId": "my-tenant-id",
    "ClientId": "my-client-id",
    "CallbackPath": "/signin-oidc"
  },

在My Azure Active Directory Tentant中

我已经配置了2个“回复网址”

现在是错误/我的问题

当我点击该网站时,我会登录。之后登录,并选择是否“保持登录状态”,我被带到了一个有错误的页面。

在此输入图像描述

您可以在错误中看到,尝试重定向到的回复地址是HTTP,而不是HTTPS。 我认为这是来自appsettings.json中的一行说:

"CallbackPath": "/signin-oidc"

由于我的.NET核心站点(通过端口5000上的Kestrel)不在HTTPS上,因此它尝试加载http://example.com / signin-oidc而不是HTTPS。 请记住,我的.NET核心站点位于NGinX反向代理之后,该代理配置为处理443上的流量。

谢谢,

我看到了这个并且能够使它工作: https//github.com/aspnet/Security/issues/1702

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

        app.UseForwardedHeaders(fordwardedHeaderOptions);

您应该查看有关Linux托管的文档。

请确保您使用UseForwardedHeaders之前中间件管道UseAuthentication

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

app.UseAuthentication();

Nginx将在将呼叫转发给Kestrel之前为其分配一个标头(以及其他内容)。 然后,此中间件将检查这些标头以设置正确的协议。

在startup.cs中,您可以尝试强制使用主机名和架构。 以下代码可以提供帮助。 重要: 设置身份验证之前放置它。

app.Use((context, next) =>
{
   context.Request.Host = new HostString(hostname + (port.HasValue ? ":" + port : null));
   context.Request.Scheme = protocol;
   return next();
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM