IdentityServer:获取请求在一段时间后失败,因为用户再次通过身份验证

IdentityServer: fetch requests fails after some time because user gets authenticated again

我有一个 asp.net 核心网络应用程序,它连接到身份服务器。我可以毫无问题地登录和注销。我的问题是,我有很多获取请求来更新页面中的某些数据而无需重新加载页面。一段时间后,获取请求被转发到端点“signin-oidc”,它 returns 一个 Html 错误!

获取请求如下:

function ReqeustImageFromServer(guid, controller, action) {
var ajx = function () {
  return new Promise(function (resolve, reject) {
     $.ajax({
        type: "GET",
         url: PAGE_BASE_PATH + "/" + controller + "/" + action + "?GUID=" + guid ,
        dataType: 'json',
        success: function (data) {
           resolve(data)
        },
        error: function (err) {
           reject(err);
        }
     });
  });
}
return ajx();
}

fetch请求时try catch捕获的错误如下:

{"readyState":4,"responseText":"<html><head><meta http-equiv='X-UA-Compatible' content='IE=edge' /><base target='_self'/></head><body><form method='post' action='https://tu_elam2020/flowchart/signin-oidc'><input type='hidden' name='code' value='FD644F046911C8141FA455C74700DDB925020ECB843936E1B177B227B33D93F2' />\n<input type='hidden' name='scope' value='openid profile roles offline_access IdentityServerApi' />\n<input type='hidden' name='state' value='CfDJ8Ahux529-J9FqVkcJ6VRjkmuYUrfgO7yb64nPlQQNx1bCz2evlk0fy6BhaWa2tmzc7YPGDbq3nTbQMfbZhR1Gbz7F0OcqzqPpPPBHiejRjkzg5C3_brtc1ebGDNdNvHxvUTpcu6AASzXzAjTmzr9ICh_pQuGGcH8bqJcoIhXKdnStqGA5hD8Afquvi7dTWIY83CCibp9FmI9NgVnpZ2l3m48EXhllZyURF6wCDrz_LuAOhOoUf3J4HYPGgZ7fUuNbLmfh56kp6y9C1CvN8A7SHlAbSyEZHaVq1E84dgouVUmRQ8BNl9FlAynHbUxLH9pFo5SxhFjqqr3NWs8cpZ8n0jHCEcu7KM3Qvs6Ph6Mrs2Gr699xCveUS7VbjnlhFe9D36q9d1TmeCyPRc_1X2y0t3yEDI42XCHVQeZKLxbINsDfxZjkwmYZOgunexIH8laUx8ehhx9-JmE0KDVodQ_xWNdTrEph3NXeVuxXMO5rKnfyy43YjhIq5AN5YMpQlScPA' />\n<input type='hidden' name='session_state' value='zfffMZKIbc_SOqDfN9Xnt19T3Y_hm7do5677r6BCNoU.7D6C35D47AAAED1B6945DE2BD29D415D' />\n<noscript><button>Click to continue</button></noscript></form><script>window.addEventListener('load', function(){document.forms[0].submit();});</script></body></html>","status":200,"statusText":"parsererror"}

但是当我重做触发获取请求的操作时它正常工作!

我不知道该如何处理?我假设当 identityToken 过期并且它会自行更新时会发生这种情况。但即便如此,我怎样才能让我的获取请求继续做它必须做的事情?

希望你能帮助我。提前致谢!

您在响应中看到的是 IdentityServer return 返回浏览器的 授权码 。然后浏览器会自动将表单数据提交回客户端,以便用户可以登录。

您看到的是人类用户登录时流程的一部分,您在进行 API 调用时不应该看到。

当您发出 API 请求时,您应该 return 状态代码 401/403 而不是要求用户再次登录。

这是因为您在同一服务中拥有 API 和网站。

主要问题是当不允许用户访问您请求的资源时,您的后端正在挑战 OpenIDConnect 处理程序而不是 JwtBearer 处理程序。(您使用 AddJwtBearer 吗?)

在您的抓取中,应该始终允许还是应该使用 JWT 令牌对其进行保护?

如果它应该是 public 您需要将 AllowAnonymous 属性添加到控制器。