Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/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
Asp.net core AzureAD中间件因HTTP/HTTPS重定向URI问题而中断_Asp.net Core_Azure Active Directory_Openid Connect - Fatal编程技术网

Asp.net core AzureAD中间件因HTTP/HTTPS重定向URI问题而中断

Asp.net core AzureAD中间件因HTTP/HTTPS重定向URI问题而中断,asp.net-core,azure-active-directory,openid-connect,Asp.net Core,Azure Active Directory,Openid Connect,我正在尝试在运行ASP.NET Core 3.1的Blazor服务器端应用程序上设置AzureAD。配置反映了Blazor模板显示的应用程序的配置,因此没有什么异常。下面是Startup.cs文件中的相关信息——请注意,除了这些信息之外,几乎没有其他内容 services.AddAuthentication(AzureADDefaults.AuthenticationScheme) .AddAzureAD(opt => { opt.Domain = "example.

我正在尝试在运行ASP.NET Core 3.1的Blazor服务器端应用程序上设置AzureAD。配置反映了Blazor模板显示的应用程序的配置,因此没有什么异常。下面是Startup.cs文件中的相关信息——请注意,除了这些信息之外,几乎没有其他内容

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
  .AddAzureAD(opt => {
    opt.Domain = "example.com";
    opt.TenantId = "tenantId";
    opt.Instance = "https://login.microsoftonline.com/";
    opt.ClientId = "clientId";
    opt.CallbackPath = "/signin-oidc";
  });
我正在使用Azure应用程序网关,我已经在那里安装了所有证书。因为它允许SSL展开,所以所有请求都应该命中应用程序网关,展开,然后路由到运行web服务器的服务,无论它位于后端的何处。证书管理是最痛苦的,我理想情况下希望在集群内的HTTP上下文中完全运行服务器,特别是因为该服务无法从internet访问

应用程序网关仅将入站HTTPS请求指向服务。HTTP请求被重定向到HTTPS侦听器

这显然是ASP.NET核心中间件的一个问题。根据上面的配置,我只能设置路径。事实证明这是一个问题。重定向uri中的值指向。注意协议——我认为它使用http,因为中间件发现http没有在机器上使用

我在Microsoft登录页面上被删除,我登录,它点击应用网关上的重定向(因为重定向uri指向http://),并重定向到https。App Gateway打开SSL,服务接收请求。我有一个DevelopmentException页面显示错误,它表明在处理请求时发生了未处理的异常。不幸的是,它很模糊:

异常:OpenIdConnectAuthenticationHandler:消息。状态为null 或者是空的。未知位置。异常:运行时遇到错误 处理远程登录。 Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler.HandlerRequestAsync() Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext (上下文) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext (上下文)

现在,我阅读了一些关于这方面的类似注释,有人建议我可以使用OpenId Connect OnRedirectToIdentityProvider事件拦截并设置RedirectUri值,以将其设置为我想要的任何值

更新Startup.cs时,我设置了以下内容:

services.AddAuthentication(opt => {
    opt.DefaultScheme = AzureADDefaults.AuthenticationScheme;
    opt.DefaultChallengeScheme = "oidc";
  })
  .AddAzureAD(opt => {
    opt.Domain = "mydomain.net";
    opt.TenantId = "tenantId";
    opt.Instance = "https://login.microsoftonline.com/";
    opt.ClientId = "clientId";
    opt.CallbackPath = "/signin-oidc";
  })
  .AddOpenIdConnect("oidc", opt => {
    opt.ClientId = "clientId"; //If I don't set this, I get an error it's not set
    opt.Authority = $"https://login.microsoftonline.com/{tenantId}/v2.0/";
    opt.Events.OnRedirectToIdentityProvider = async c => {
      c.ProtocolMessage.RedirectUri = "https://{domain}/signin-oidc";
      await Task.FromResult(0);
    };
  });
理想情况下,这包括将重定向uri值更改为使用“https”而不是“http”的最小可能量。这会跳过重定向,但不幸的是会产生一个不同的异常:

异常:无法取消对message.State的保护。未知位置。 异常:处理远程登录时遇到错误。 Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler.HandlerRequestAsync() Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext (上下文) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext (上下文)

在这一点上四处搜索并不会产生很多相关的想法

如果我在dev中完全在本地运行它,并且没有https组件(所有HTTP),那么它就可以正常工作。因此,这里的问题似乎是中间件生成http://而应用网关接收https://(在潜在重定向之后),这似乎破坏了一切。理想情况下,设置RedirectUri属性可以解决这一问题,但似乎会弄乱数据在传输过程中的保护方式


有人能解释一下如何让这个场景生效吗?谢谢大家!

我遇到了类似的问题,我的解决方案是:

  • 将c.ProtocolMessage.RedirectUri设置为httpS URL

  • 使用此选项将Cookie设置为安全的

    options.NonceCookie = new CookieBuilder { 
         Name = OpenIdConnectDefaults.CookieNoncePrefix,
         HttpOnly = true,
         SameSite = SameSiteMode.None,
         SecurePolicy = CookieSecurePolicy.Always,
         IsEssential = true
    }
    options.CorrelationCookie = new CookieBuilder {
        SecurePolicy = CookieSecurePolicy.Always
    }
    

  • 我有一个类似的问题,我的解决方案是:

  • 将c.ProtocolMessage.RedirectUri设置为httpS URL

  • 使用此选项将Cookie设置为安全的

    options.NonceCookie = new CookieBuilder { 
         Name = OpenIdConnectDefaults.CookieNoncePrefix,
         HttpOnly = true,
         SameSite = SameSiteMode.None,
         SecurePolicy = CookieSecurePolicy.Always,
         IsEssential = true
    }
    options.CorrelationCookie = new CookieBuilder {
        SecurePolicy = CookieSecurePolicy.Always
    }
    

  • 您好,如果发布的答案解决了您的问题,请单击复选标记将其标记为答案。这样做有助于其他人找到问题的答案。谢谢@GovindSharma MSFTIdentity。现在,我还没有确认它是否解决了我的问题,但如果它解决了,我会相应地更新。嗨,如果发布的答案解决了你的问题,请单击复选标记将其标记为答案。这样做有助于其他人找到问题的答案。谢谢@GovindSharma MSFTIdentity。在这一点上,我还没有确认它解决了我的查询,但如果它解决了,我会相应地更新。