【发布时间】:2019-09-28 07:19:55
【问题描述】:
我有一个托管在网络上的 .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);
这一切都适用于除一个用户之外的每个用户 - 但是,当这个特定用户(第 3 方)与特定页面交互时,他们的浏览器中会出现身份验证弹出窗口(他们已经尝试了一些) -其他所有页面都可以正常工作。
这让我相信问题是环境问题,但我想了解这里可能发生的情况。
所讨论的页面与其他所有页面之间的唯一区别是,该页面执行 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>
不幸的是,作为第 3 方,我无法真正连接到机器以查看浏览器的调试控制台。
我的问题确实是一个长镜头 - 听起来可能是代理问题,但我不明白为什么发出 AJAX 调用与发出登录 POST 请求有什么不同,除非我的 AJAX 设置当然丢失了一些需要的身份验证数据 - 可能是某种标题?
有没有人见过这样的东西?
【问题讨论】:
-
您的操作名称正确吗?我看到你把_Save放在这里
-
是的,它是正确的,它适用于 99% 的用户,只有特定网络上的一个用户有问题。
-
那么你可以调用 ajax 到你的控制器吗?
-
所有细节都在问题中 - 我认为没有任何缺失的信息。如问题中所述,它适用于除一个特定用户之外的多个网络中的每个用户。
-
嗯,也许是一些防火墙或 ip 配置?
标签: ajax authentication asp.net-core cookies