使用AJAX时出现神秘的401挑战

6

我有一个托管在网络上的.NET Core Web应用程序。

我正在使用基于声明的身份验证通过 cookie:

当登录成功时...

var principal = new ClaimsPrincipal();
var id = new ClaimsIdentity(user);
id.AddClaim(new Claim("ViewData", "Allowed"));
id.AddClaim(new Claim("TenantId", user.TenantId));
principal.AddIdentity(id);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);

除了一个特定的第三方用户之外,这一切都运行良好。当这个用户与特定页面交互时(他们尝试了几种浏览器),会在其浏览器中遇到认证弹出框 - 每个其他页面都可以正常工作。
这使我相信问题是环境相关的,但我想了解这里可能发生了什么。
疑问页面和其他页面之间唯一的区别是,该页面通过 AJAX 提交到控制器以保存某些数据。Home 控制器需要授权才能查看(或编辑)数据。 Ajax 是您的标准内容
Razor:
$.ajax({
  type: 'POST',
  url: '@Url.Action("_Save", "Home")',
  dataType: 'json',
  contentType: 'application/json',
  data: ko.toJSON(viewModel.model()),
  success: function (result) {
  //... callback code etc

检查渲染的JS代码,发现AJAX调用是相对于当前页面的,因此不会导向奇怪的URL。

原始JS代码:

$.ajax({
  type: 'POST',
  url: '/Home/_Save',
  dataType: 'json',
  contentType: 'application/json',
  data: ko.toJSON(viewModel.model()), // ... etc

我在浏览器中查看时可以看到cookie被包含在头文件中:
accept: application/json, text/javascript, */*; q=0.01
accept-encoding: gzip, deflate, br
accept-language: en-GB,en-US;q=0.9,en;q=0.8
cache-control: no-cache
content-length: 4775
content-type: application/json
cookie: <cookie details here>

很遗憾,由于它是第三方,我无法连接到机器查看浏览器的调试控制台。

我真正关心的问题可能是一次不大可能的尝试 - 听起来可能是代理问题,但我不明白为什么进行AJAX调用与进行登录POST请求有所不同,除非我的AJAX设置缺少某些所需的授权数据 - 也许是某种头部信息?

有人见过这样的情况吗?


你的操作名称正确吗?我看到你在这里放了_Save。 - Tony Ngo
是的,没错。它在99%的用户上都能正常工作,只有一个特定网络的用户出现了问题。 - Charleh
所有细节都在问题中 - 我认为没有任何遗漏的信息。如问题所述,它适用于多个网络中的每个用户,除了一个特定的用户。 - Charleh
据我所知,AJAX请求是在您托管的页面之一上进行的,当特定用户尝试访问它时,会弹出另一个页面?如果是这样,您知道弹出窗口的URL吗? - Siavas
弹出窗口来自浏览器(标准凭据对话框),而不是另一个站点——就好像该站点发出了401挑战,浏览器正在请求基本凭据。事实证明,它刚开始为他们工作,所以我怀疑这是与网络有关的问题。我的网站所做的只是与自身通信! - Charleh
显示剩余5条评论
2个回答

3
我曾经遇到过类似的问题,通常与安全设置有关。你可以尝试查看CSRF标头。可能是几个问题。这可能包括本地防病毒软件、机器防火墙、反间谍软件或其他隐私/保护应用程序。由于只有单个用户受影响,调试将非常困难,我建议您找出该用户的安全设置/应用程序与同事的差异所在。
在特定浏览器中将您的站点添加到可信站点列表中可能会解决单个问题。它几乎肯定隐藏在其中某个地方。

感谢提供信息。每个用户都在不同的基础设施上,因为这是第三方供应商门户网站。我正在尝试让第三方从调试控制台发送给我一些详细信息,希望至少能显示拦截请求的内容。没有跨站点调用 - 它只是从当前引用程序到同一URL上的另一个路由的XHR调用,因此我正在努力理解什么会阻止它。听起来请求最终解析到另一个主机 - 登录弹出窗口非常奇怪... - Charleh
我给你发放奖励,因为我相信这就是问题所在 - 我只是想让别人说出我所思考的同样的事情,但一周左右后它自己解决了,所以我怀疑某些与网络有关的东西并没有完全信任该网站。 - Charleh
2
我的意思是,我很感激,同时也很抱歉没有人提出一个完美的解决方案。前端网页开发很烦人,很难,否则任何人都可以做得很好。 - Dylan Brams

0

好的,这个问题过一会儿就解决了 - 我相信这可能是网络相关的。

第三方一周后再次尝试,这次没有出现任何问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接