我正在开发一个netcore MVC应用程序,该应用程序使用Ajax请求将数据POST到服务器。我使用IdentityServer4作为我的auth中间件。该流程是在启动应用程序时使用http://localhost:6002的URL重定向到IdentityServer(localhost:6000)。用户登录并重定向到主应用程序,然后工作正常。
Ajax GET请求也可以正常工作。我可以在控制器(User.Identity.Claims)中观察Get操作的声明列表。但是,当我从服务器尝试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执行重定向,然后IdentityServer返回到客户端而不实际执行我的操作。
我的控制器操作类似于
[Authorize]
[HttpPost]
public async Task<JsonResult> Update([FromBody] MyVM myVM)
{
}
如果我删除[Authorize]属性,则会达到该方法,但User.Identity.Claims的值始终为空,在HTTP中,它包含所有声明的列表。
以下是从Startup.cs文件配置IdentityServer的相关部分
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时,它完美地工作了很多,它是不管理重定向的Fetch API。此调用正常
$.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