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