我试图在运行ASP.NET Core3.1的Blazor服务器端应用程序上设置ASP.NET。它的配置反映了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展开,所以所有请求都应该访问App,然后打开,然后路由到运行web服务器的服务,无论它位于后端。证书管理是痛苦的,理想情况下,我希望在集群中完全在HTTP上下文中运行服务器,特别是因为该服务在其他方面无法从internet访问。
应用程序网关只将入站HTTPS请求指向服务。HTTP请求重定向到HTTPS侦听器。
这显然是ASP.NET核心中间件的一个问题。根据上面的配置,我只能设置路径。这证明是个问题。redirect_uri中的值指向http://example.com/signin-oidc。注意协议--我认为它使用的是http,因为中间件发现HTTP没有在机器上使用。
我被放到了微软登录页面,我登录,它点击重定向的App (因为redirect_uri指向http://),然后重定向到https )。App打开SSL,服务接收请求。我已经获得了显示错误的DevelopmentException页面,它表明在处理请求时出现了一个未处理的异常。不幸的是,它是模糊的:
异常: OpenIdConnectAuthenticationHandler: message.State为空或空。不明地点。异常:在处理远程登录时遇到错误。( Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler.HandleRequestAsync() Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext上下文) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext上下文)
现在,我阅读了关于这方面的一些类似的注释,有人建议我可以使用OpenId连接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);
};
});
理想情况下,这包括将redirect_uri值更改为使用"https“而不是"http”的最小数量。这跳过了重定向,但不幸的是产生了另一个例外:
异常:无法解除对message.State的保护。不明地点。异常:在处理远程登录时遇到错误。( Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler.HandleRequestAsync() Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext上下文) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext上下文)
在这个问题上,四处搜索并不能产生很多相关的想法。
如果我在dev中完全在本地运行,并且没有https组件(全部是HTTP),那么这是没有问题的。因此,这里的问题似乎是中间件生成http://,appears接收https:// (在可能的重定向之后),这似乎破坏了一切。理想情况下,设置RedirectUri属性可以修复此问题,但似乎会影响数据在传输过程中的保护方式。
有人能解释一下如何让这个场景工作吗?谢谢!
发布于 2021-01-05 10:24:24
我也有类似的问题,我的解决办法是:
所做的一样
options.NonceCookie =新CookieBuilder { Name = OpenIdConnectDefaults.CookieNoncePrefix,HttpOnly = true,SameSite = SameSiteMode.None,SecurePolicy = CookieSecurePolicy.Always,IsEssential = true } options.CorrelationCookie = new CookieBuilder { SecurePolicy = CookieSecurePolicy.Always }
https://stackoverflow.com/questions/65177175
复制