iis 使用Azure AD进行身份验证时,我们有时会在部分页面更新期间收到CORS或Access-Control错误

0wi1tuuw  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(127)

在我们使用Microsoft Azure AD进行身份验证的网站上,我们偶尔会遇到CORS错误-只是有时而且仅针对某些用户。
这是一个网站(混合ASP.NET,.NET Core和经典ASP)运行在Windows Server 2016上的IIS中。它位于一个由2台服务器组成的Web场中,在场之前有一个“粘性会话”负载平衡器。几个月前,我们改用Azure AD(使用公司安全组的AD设置)。公司内的所有网站正在迁移或已迁移到Azure AD身份验证。本网站在公共网站上可用,有少数公共页面,但大多数页面需要身份验证。
通常,Azure身份验证对所有用户都运行良好,但偶尔用户会在使用销售.NET UI控件的知名公司的ASP.NET Web窗体组件进行“部分页面”(类似AJAX)保存或编辑操作时遇到错误。我怀疑,但不能证实,这些错误只在需要刷新身份验证令牌时才会发生(而且是在部分页面更新中发生的)。
如果用户在出现错误时打开了浏览器开发人员工具,他们将看到如下错误:
CORS策略已阻止从源“https://WEBSITE”访问“https://login.microsoftonline.com/[...]”上的XMLHttpRequest(从“https://WEBSITE/FOLDER/PAGENAME”重定向):请求的资源上不存在“Access-Control-Allow-Origin”标头。
我尝试在站点的顶级web.config文件中添加各种“Access-Control”自定义头,包括一段时间内添加通配符“Access-Control-Allow-Origin”条目。但是,似乎这些设置可能需要在microsoftonline网站上,而不是在我们的网站上。目前,我已经删除了所有的“访问控制”设置。
我以前有一个“X-Frame-Options”头设置为“SAMEORIGIN”,但我也删除了它。
我确实有一个“Content-Security-Policy-Report-Only”(仅报告)策略,允许连接到“login.microsoftonline.com”-这不会报告任何可能被阻止的连接。
您对设置或标头有什么建议吗?我可以使用这些设置或标头来使这些连接始终允许?或者,您可能建议的任何其他故障排除步骤?

编辑:我现在尝试在web.config中执行以下操作:

Access-Control-Allow-Origin : https://[OUR-WEBSITE]
Access-Control-Allow-Credentials : true
Access-Control-Allow-Methods : GET, POST, OPTIONS
Access-Control-Allow-Headers : Origin, Content-Type, Accept

在“customHeaders”部分;形式为:[add name=“Access-Control-Allow-Credentials”value=“true”/]等。

EDIT-2:此更改没有帮助-仍然得到No 'EST-Control-Allow-Origin'头错误。
编辑#

我已经能够在Visual Studio 2022中使用标准/模板项目**重现问题(没有任何第三方组件)。
这是使用Visual Studio 2022的最新版本/更新,并且还使用“个人”Azure AD配置(使用我的MSDN帐户)。
运行Visual Studio 2022,选择“新建项目”,选择模板“ASP.NET Web应用程序(.NET Framework)”,然后单击“下一步”。
输入项目的名称,确保选中了“.NET Framework 4.8”,然后单击“创建”。
在下一个屏幕中,选择“Web Forms”,并(重要的是)选择“Microsoft身份平台”作为身份验证选项,然后单击“Create”。
当项目在Visual Studio中创建并打开时,它会显示一个关于“需要安装的组件”的对话框,包括“dotnet midentitytool”;单击“下一步”。
之后,它将显示一个“Microsoft身份平台”屏幕,您可能需要登录(如果您还没有创建租户,则可能需要创建租户)。我已经有一个租户和该租户拥有的应用程序,使用我的MSDN帐户。选择(或创建)一个应用程序,然后单击“下一步”。
在“更改摘要”屏幕上,单击“完成”。完成此工作后,单击“关闭”。
现在,在Visual Studio编辑器中打开“Default.aspx”页面,并在最后,在关闭的“asp:Content”标签之前,添加以下内容:

<script type="text/javascript">
  function refreshSession() {
    fetch("Contact.aspx");
  }
  setInterval(refreshSession, 120000);
</script>

上面的JavaScript代码每2分钟对“Contact.aspx”页面进行一次XMLHttpRequest /fetch调用(并丢弃结果)。这是一个页内或部分页请求,不需要重新加载当前页或打开应用程序中的另一页。
然后,运行/调试打开到默认页面(添加上述JavaScript的页面)的项目。打开浏览器开发工具,选择“网络”和“控制台”项,然后等待。
经过一段时间(45分钟,也许一个小时),您将开始看到“[...]被CORS策略阻止:在浏览器的Console窗口中,请求的资源上没有“Access-Control-Allow-Origin”标头。这是我需要解决的错误。

编辑8月9日=

我已经取得了一些进展,但仍然没有一个完整的答案。
我在启动代码中添加了以下代码段:

CookieSameSite = SameSiteMode.None,
CookieSecure = CookieSecureOption.Always,
[...]
Provider = new CookieAuthenticationProvider()
{
    OnResponseSignIn = (context) =>
    {
        context.Properties.ExpiresUtc = DateTimeOffset.UtcNow.AddHours(12);
    }
},
[...]
new OpenIdConnectAuthenticationOptions
{
UseTokenLifetime = false,

其中一些来自这篇文章:https://blogs.aaddevsup.xyz/2021/04/8044/

这似乎解决了我们所有单服务器环境(工作站、开发服务器、测试服务器、暂存服务器)中的问题。
然而,在我们的生产“Web农场”环境中(2台IIS Web服务器,前面有一个负载平衡器),这种情况(页面内XMLHttpRequest)仍然会失败,并在大约10分钟内显示相同类型的错误消息。这可能是因为Microsoft Identity刷新令牌不知道返回哪个服务器。(负载平衡器配置为“粘性会话”。)

2guxujil

2guxujil1#

最后一个缺失的部分-负载均衡器为“持久连接cookie”设置了一个非常短的超时;我们要求将暂停时间增加到120分钟。在此之后,网页中的XMLHttpRequest调用在长达120分钟的超时时间内都是成功的。

相关问题