我在我的Web应用程序中具有基于Cookie的身份验证,子应用程序向该身份验证发出一些ajax请求以从db获取数据。
问题是,如果用户未通过身份验证,我会将他重定向到expired.html
,在测试模式下,如果我只是在浏览器或邮递员中运行类似example.com/api/test
的api调用而没有先获得我正确重定向到的身份验证Cookie expired.html
。当我尝试通过ajax
调用该api时,就会出现问题,因此通过进行以下简单的.get
请求:
function getPlu(codplu, callback){
let api = 'https://www.example.it/api/plu/?codplu=' + codplu
$.get( api, callback );
}
getPlu('COPERTI', callback => {
...
});
我只是从具有代码302
和.get
的api到具有代码expired.html
的304
的响应,但是用户仍未重定向到expired.html
,因此在cookie过期并且i [C0 ]发送,它看起来如下:
.get
因此,您可以看到该api请求的状态代码为302,位置应为,但不会被重定向。
expired.html
可能是浏览器无法自动处理Ajax重定向,我需要通过客户端(如果status.code == 302进行重定向),或者我可以通过服务器端进行修复?
这是身份验证进行重定向的方式
来自jQuery文档:
如果请求成功,则状态码函数采用与成功回调相同的参数;如果导致错误(包括3xx重定向),则它们将使用与错误回调相同的参数。
因此,jquery确实将其视为错误,因此不会重定向或执行其他请求。实际上,您完全是异步的(ajax),因此就像另一层请求/响应。
总而言之,您应该手动重定向:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options => {
options.Cookie.Name = "AUTH_TOKEN";
options.Cookie.MaxAge = TimeSpan.FromMinutes(120);
options.Events = new CookieAuthenticationEvents()
{
OnRedirectToLogin = (context) =>
{
context.HttpContext.Response.Redirect("https://www.example.it/vmenu/expired.html");
return Task.CompletedTask;
}
};
});