我在网上托管了一个.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设置丢失了一些所需的身份验证数据-也许是某种标题?
以前有没有人看过类似的东西?
答案 0 :(得分:3)
我已经看到类似这样的问题,并且它们通常与安全设置有关。您可以尝试查看CSRF标头。可能是几件事。这可能包括本地防病毒软件,机上防火墙,反间谍软件或其他隐私/保护应用程序。由于它是单个用户,因此调试将非常困难,我建议您弄清楚该用户的安全设置/应用程序与同事的不同。
将您的站点添加到特定浏览器的“受信任的站点”列表中可以解决单个问题。几乎可以肯定那里藏着一些东西。
答案 1 :(得分:0)
好吧,过一会儿它就会自动消失-我认为这可能与网络有关。
第三党在一周后再次尝试,这次没有任何问题。