У меня есть веб-приложение .NET Core, размещенное в сети.
Я использую авторизацию на основе утверждений с помощью файлов 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 - ваш стандартный материал
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
Raw 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 отсутствует некоторые данные аутентификации, которые требуются - может быть, какой-то заголовок?
Кто-нибудь видел что-то подобное раньше?