我有一个托管在网络上的.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设置缺少某些所需的授权数据 - 也许是某种头部信息?
有人见过这样的情况吗?