我们在现有 Blazor Server Web 应用程序上看到了奇怪的行为,该应用程序使用 ASP.NET Identity 来管理用户(该应用程序不是由我们的开发团队开发的,我们无权访问开发它的团队) 。现在,在讨论我们遇到的问题之前,让我首先尝试恢复我们的生产设置:
现在的问题是:将此默认设置应用于此 Blazor Server 应用程序后,该应用程序将无法正确处理身份验证 cookie,并且用户最终在登录后被重定向到默认入口页面,而不是被重定向到安全区域该应用程序。在浏览器(开发工具)上,我可以看到生成了身份验证 cookie,但每当用户尝试访问应用程序的安全区域时,都会发送 cookie,但就好像它不存在(或不被视为框架有效吗?)。
现在,这是奇怪的部分:如果我们将仅将 SAN 设置为其主机名和 IP 地址的 Web 服务器上用于 TLS 的内部证书替换为将 SAN 设置为其主机名、子域名(即,正在调用的站点的名称)和 IP 地址,一切正常。
事实上,我们做了以下尝试:
现在,有人对这里发生的事情有一个合乎逻辑的解释吗?我还没有开发任何 blazor 服务器或 signalr 应用程序,但我开发了一些 aspnet 核心应用程序(mvc、web api 甚至 blazor wasm),但我不记得在文档中看到过任何解释此行为的内容。
证书SAN和aspnet认证有什么关系?我真的不认为有,但是如何解释这种行为(即,身份验证 cookie 似乎仅当服务器的证书在其 SAN 上具有站点名称时才被处理)?此行为信号器相关吗?
正如我所说,我们为传统的 ASP.NET MVC 应用程序进行了此设置,并且一切正常。对发生的事情有什么想法吗?关于如何调试这个有什么想法吗?
顺便说一句,它托管在 IIS 上,我的印象是客户端正在使用轮询与服务器端进行通信。
谢谢。
因此,在检查了应用程序的代码之后,我们已经成功地了解了发生了什么(感谢 dotpeek)。最后,Blazor 服务器应用程序最终调用一个控制器方法(托管在同一站点上)来获取有关当前登录用户的信息(不知道为什么开发人员不简单地直接调用其中一个身份类)将其包装在 Web 服务调用中),这就是事情开始走下坡路的地方。
HttpClient 用于该调用,并且由于它在 tls 调用期间默认执行证书验证,并且服务器的证书的 san 仅设置为计算机名称和 IP(未指定站点名称),因此调用没有通过,并且请求处理“中止”,最终返回默认页面的 200 ok,而不是网站私有区域的 302。