Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Authentication Azure AD身份验证重定向\u uri在linux托管(Cloud Foundry)ASP.NET Core 2.2应用程序上不使用https_Authentication_Asp.net Core_Https_Azure Active Directory_Cloud Foundry - Fatal编程技术网

Authentication Azure AD身份验证重定向\u uri在linux托管(Cloud Foundry)ASP.NET Core 2.2应用程序上不使用https

Authentication Azure AD身份验证重定向\u uri在linux托管(Cloud Foundry)ASP.NET Core 2.2应用程序上不使用https,authentication,asp.net-core,https,azure-active-directory,cloud-foundry,Authentication,Asp.net Core,Https,Azure Active Directory,Cloud Foundry,我在SAP云环境(Cloud Foundry)中的linux容器上托管了一个ASP.NET核心应用程序 我正在使用Microsoft.AspNetCore.authentication.AzureAD.UI库实现Azure AD身份验证 身份验证失败,因为无论我最初访问web应用程序的协议是什么,它都会使用http协议生成redirect\u uri 此操作失败,因为它与Azure中应用程序注册中定义的https url不匹配 AADSTS50011: The reply url specifi

我在SAP云环境(Cloud Foundry)中的linux容器上托管了一个ASP.NET核心应用程序

我正在使用
Microsoft.AspNetCore.authentication.AzureAD.UI
库实现Azure AD身份验证

身份验证失败,因为无论我最初访问web应用程序的协议是什么,它都会使用
http
协议生成
redirect\u uri

此操作失败,因为它与Azure中应用程序注册中定义的https url不匹配

AADSTS50011: The reply url specified in the request does not match the reply urls configured for the application
在选项中,您可以传入
回调路径
,但这只接受相对路径(必须以/)开头)。 否则,它将来自基于url自动生成的重定向url

我不明白的是,即使我使用
https
直接在浏览器中访问应用程序,它仍然在重定向uri中使用http

我想潜在的问题是,云铸造中托管的应用程序接受http请求

下面是我如何实现Azure AD身份验证的代码部分

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
        .AddAzureAD(options => Configuration.Bind("Authentication:AzureAD", options));

services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
   {
       options.Authority = options.Authority + "/v2.0";            // Microsoft identity platform
       options.TokenValidationParameters.ValidateIssuer = true;   
   });


 app.UseHsts();
 app.UseHttpsRedirection();


  "Authentication": {
    "AzureAD": {
      "Instance": "https://login.microsoftonline.com/",
      "ClientId": "{app-application-id}",
      "TenantId": "{my-tenant-id}"
    }
  }
services.AddAuthentication(AzureAddFaults.AuthenticationScheme)
.AddAzureAD(options=>Configuration.Bind(“身份验证:AzureAD”,options));
配置(AzureADDefaults.OpenIdScheme,选项=>
{
options.Authority=options.Authority+“/v2.0”;//Microsoft identity platform
options.TokenValidationParameters.ValidateIsuer=true;
});
app.UseHsts();
app.UseHttpsRedirection();
“身份验证”:{
“蓝精灵”:{
“实例”:https://login.microsoftonline.com/",
“ClientId”:“{app application id}”,
“租户id”:“{我的租户id}”
}
}
您的问题类似于。不同之处在于,您在cloudfoundry中部署了应用程序,而另一个在Azure web app中部署了应用程序

如果您的应用程序被迫使用https,您只需强制
重定向\u uri
使用
https

如果您想要一个http和https都能工作的通用解决方案(前提是您已经在azure portal中将http和https配置为重定向url),您可以尝试在标题中找到真正的proto。

您的问题类似于。不同之处在于,您在cloudfoundry中部署了应用程序,而另一个在Azure web app中部署了应用程序

如果您的应用程序被迫使用https,您只需强制
重定向\u uri
使用
https


如果您想要一个http和https都能工作的通用解决方案(前提是您已经在azure portal中将http和https配置为重定向url),您可以尝试在标题中找到真正的原型。

Tony Ju提供了一个指向类似问题的极好链接,帮助我缩小范围并最终解决问题

但是,该解决方案只提供代码示例,我想再多写一点我是如何实现最终实现的

当您的应用程序位于代理服务器和/或负载平衡器之后时,该问题与此相关。代理隐藏了有关初始请求的信息,例如原始模式,从而使应用程序中依赖此信息的服务行为不正确(例如返回url)

从文档中可以看出,这是我问题的根本原因

当通过HTTP代理HTTPS请求时,原始方案(HTTPS) 已丢失,必须在标头中转发

以及:

协议 从公共互联网到云控制器的所有流量 UAA发生在HTTPS上。在系统的边界内, 组件通过发布-订阅(pub-sub)消息总线进行通信 NAT、HTTP和SSL/TLS

简而言之,您需要使用标准的
中间件
转发某些httpheader

services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = 
        ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});

app.UseForwardedHeaders();

看起来.net core 3不再需要此功能,但SAP尚未更新其dotnet容器,因此我在撰写本文时无法对其进行验证。

Tony Ju提供了一个指向类似问题的极好链接,帮助我缩小范围并最终解决问题

但是,该解决方案只提供代码示例,我想再多写一点我是如何实现最终实现的

当您的应用程序位于代理服务器和/或负载平衡器之后时,该问题与此相关。代理隐藏了有关初始请求的信息,例如原始模式,从而使应用程序中依赖此信息的服务行为不正确(例如返回url)

从文档中可以看出,这是我问题的根本原因

当通过HTTP代理HTTPS请求时,原始方案(HTTPS) 已丢失,必须在标头中转发

以及:

协议 从公共互联网到云控制器的所有流量 UAA发生在HTTPS上。在系统的边界内, 组件通过发布-订阅(pub-sub)消息总线进行通信 NAT、HTTP和SSL/TLS

简而言之,您需要使用标准的
中间件
转发某些httpheader

services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = 
        ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});

app.UseForwardedHeaders();

看起来.net core 3不再需要此链接,但SAP尚未更新其dotnet容器,因此我在撰写本文时无法对其进行验证。

感谢您指出此链接,它确实与我的链接相同。因此,这个问题似乎与linux环境和代理有关。有一些我不知道的有趣点,比如
转发头选项
。我暂时搁置了这篇文章,以关注其他一些特性,但下周我会再次讨论。我会随着它的发展而更新。谢谢你指出这个链接,它确实和我的一样。因此,这个问题似乎与linux环境和代理有关。有一些有趣的地方我不知道,比如
ForwardH