Asp.net core AzureAD中间件因HTTP/HTTPS重定向URI问题而中断
我正在尝试在运行ASP.NET Core 3.1的Blazor服务器端应用程序上设置AzureAD。配置反映了Blazor模板显示的应用程序的配置,因此没有什么异常。下面是Startup.cs文件中的相关信息——请注意,除了这些信息之外,几乎没有其他内容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.
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属性可以解决这一问题,但似乎会弄乱数据在传输过程中的保护方式
有人能解释一下如何让这个场景生效吗?谢谢大家! 我遇到了类似的问题,我的解决方案是:
options.NonceCookie = new CookieBuilder {
Name = OpenIdConnectDefaults.CookieNoncePrefix,
HttpOnly = true,
SameSite = SameSiteMode.None,
SecurePolicy = CookieSecurePolicy.Always,
IsEssential = true
}
options.CorrelationCookie = new CookieBuilder {
SecurePolicy = CookieSecurePolicy.Always
}
我有一个类似的问题,我的解决方案是:
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。在这一点上,我还没有确认它解决了我的查询,但如果它解决了,我会相应地更新。