Cap*_*ate 5 azure azure-active-directory asp.net-core
我有一个.NET Core 2.0网站,在Linux上运行,侦听端口5000,位于NGinX反向代理后面,该代理侦听端口80和442。NGinX配置为将HTTP通信重定向到HTTPS,并处理所有通过HTTPS进行的通信。NGinx反向代理和Asp.Net Core应用位于共享网络中各自的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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Dotnet:Startup.cs ConfigureServices()
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddAzureAd(options => Configuration.Bind("AzureAd", options))
.AddCookie();
Run Code Online (Sandbox Code Playgroud)
Dotnet:Startup.cs Configure()
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
app.UseAuthentication();
Run Code Online (Sandbox Code Playgroud)
点网:appsettings.json
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "mycompany.com",
"TenantId": "my-tenant-id",
"ClientId": "my-client-id",
"CallbackPath": "/signin-oidc"
},
Run Code Online (Sandbox Code Playgroud)
在我的Azure Active Directory租户中
我已经配置了2个“回复URL”
现在针对错误/我的问题
当我访问该网站时,我登录。随后登录,然后选择是否“保持登录状态”,我被带到出现错误的页面。
您可以在错误中看到尝试重定向到的回复地址是HTTP,而不是HTTPS。我认为这来自appsettings.json中的行,内容为:
"CallbackPath": "/signin-oidc"
Run Code Online (Sandbox Code Playgroud)
并且由于我的.NET Core站点(通过端口5000上的Kestrel)不在HTTPS上,因此它试图加载http://example.com / signin-oidc而不是HTTPS。请记住,我的.NET Core站点位于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);
Run Code Online (Sandbox Code Playgroud)
您应该查看有关Linux 上托管的文档。
确保您UseForwardedHeaders之前在中间件管道中使用UseAuthentication:
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
app.UseAuthentication();
Run Code Online (Sandbox Code Playgroud)
Nginx 会在将调用转发给 Kestrel 之前为所使用的协议分配一个标头(除其他外)。然后,该中间件将检查这些标头以设置正确的协议。
| 归档时间: |
|
| 查看次数: |
851 次 |
| 最近记录: |