Ajax Запрос к приложению netcore mvc с использованием IdentityServer перенаправляет на конечную точку авторизации

Я занимаюсь разработкой приложения netcore MVC, которое использует запросы Ajax для отправки POST-данных на сервер. Я использую IdentityServer4 в качестве промежуточного программного обеспечения для аутентификации. Процесс запускается, когда приложение запускается с URL-адресом http://localhost:6002/, оно перенаправляется на IdentityServer (localhost:6000). Пользователь входит в систему и перенаправляется в основное приложение, которое затем работает нормально.

Ajax GET-запросы также работают правильно. Я могу наблюдать список заявок на действие Get в контроллере (User.Identity.Claims). Однако, когда я пытаюсь получить POST-данные с сервера, запрос возвращает 200, но с Identity Server с Redirect=true

Мой звонок из Javascript

applyUpdate(modelData) {
  let that = this;
  fetch("http://localhost:6002/Client/Update/", {
   method: 'post',
   headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json'
    },
   body: JSON.stringify(modelData)
   }
  ).then(function (response) {
   return response;
  }).then(function (outData) {
   alert("saved");
  });
 }

Я получаю ответ

{type: "cors", 
 url: "http://localhost:6000/account/login?returnUrl=%2Fc…%26x-client.., 
 redirected: true,
 status: 200, 
 ok: true}

Я включил CORS в приложениях, как раньше, я получил 405 проблем. Кажется, что происходит, когда я называю свое действие контроллера из Javascript, перенаправление выполняется на IdentityServer, который затем возвращается к клиенту, даже не выполняя моего действия.

Мой контроллер действия выглядит

    [Authorize]
    [HttpPost]      
    public async Task<JsonResult> Update([FromBody] MyVM myVM)
    {

    }

Если я удаляю атрибут [Authorize], метод достигается, однако значение User.Identity.Claims всегда пусто, тогда как в HTTP Get он содержит список всех моих утверждений.

Ниже приведен соответствующий раздел для настройки IdentityServer из файла Startup.cs.

        JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();         

        services.AddAuthentication(options =>
        {
            options.DefaultScheme = "Cookies";
            options.DefaultChallengeScheme = "oidc";                
        })
            .AddCookie("Cookies")
            .AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";

                options.Authority = identityUrl;
                options.RequireHttpsMetadata = false;

                options.TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = "name",
                    RoleClaimType = "role",
                };

                options.ClientId = "my client";
                options.ClientSecret = "secret";
                options.ResponseType = "code id_token";

                options.SaveTokens = true;                  
                options.GetClaimsFromUserInfoEndpoint = true;

                options.UseTokenLifetime = false;
            });

Я абсолютно озадачен таким поведением, любая помощь будет принята с благодарностью

ОБНОВИТЬ

Как ни странно, я использую Javascript Fetch API для выполнения POST, когда я выкидываю его из использования Jquery Ajax, он отлично работает, так что это API Fetch, который не управляет перенаправлением. Этот звонок работает нормально

          $.ajax({
            type: "POST",
            contentType: "application/json",
            dataType: "json",
            url: 'http://localhost:6002/Client/Update/',
            data: JSON.stringify(modelData),
            success: function success(msg) {
                alert("saved");
            },
            error: function error(xhr, data, err) {
                console.log(xhr);
            }
        });

Я не хотел включать зависимость Jquery

0 ответов

Другие вопросы по тегам