使用AJAX时的神秘401挑战

时间:2019-05-10 11:19:35

标签: ajax authentication asp.net-core cookies

我在网上托管了一个.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控制器需要验证才能查看(或编辑)数据。

[Authorize(Policy = "ViewData")]

Ajax是您的标准选择

剃刀:

$.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设置丢失了一些所需的身份验证数据-也许是某种标题?

以前有没有人看过类似的东西?

2 个答案:

答案 0 :(得分:3)

我已经看到类似这样的问题,并且它们通常与安全设置有关。您可以尝试查看CSRF标头。可能是几件事。这可能包括本地防病毒软件,机上防火墙,反间谍软件或其他隐私/保护应用程序。由于它是单个用户,因此调试将非常困难,我建议您弄清楚该用户的安全设置/应用程序与同事的不同。

将您的站点添加到特定浏览器的“受信任的站点”列表中可以解决单个问题。几乎可以肯定那里藏着一些东西。

答案 1 :(得分:0)

好吧,过一会儿它就会自动消失-我认为这可能与网络有关。

第三党在一周后再次尝试,这次没有任何问题。