重定向未在 ajax 请求中工作的非授权用户
Redirect for non authorized users not working in ajax request
我的 web 应用程序中有一个基于 Cookie 的身份验证,子应用程序向它发出一些 ajax 请求以从数据库中获取数据。
问题是,如果用户未通过身份验证,我会在测试模式下将他重定向到 expired.html
,如果我只是 运行 在浏览器或邮递员中 api 调用 example.com/api/test
没有首先获得身份验证 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 => {
...
});
我只是从 api 收到代码为 302
的响应,以及一个 .get
到 expired.html
的代码为 304
的响应,但用户仍然没有被重定向至 expired.html
所以你可以看到 api 请求的状态代码是 302,位置应该是 expired.html
但它没有被重定向。
可能是浏览器没有自动处理 ajax 重定向,我需要通过客户端来处理(如果 status.code == 302 则重定向)或者我可以通过服务器修复它边?
这是身份验证如何进行重定向
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;
}
};
});
只是为了让这个答案更清楚:
jQuery 的 ajax 使用 XMLHttpRequest object 及其方法来执行请求。 XMLHttpRequest 将自动遵循重定向。因为是 XMLHttpRequest 做的,jQuery 的 ajax 函数甚至不知道它。它只接收最终响应,在 OP 的情况下是 200 Ok(或 304 Not Modified as OP posted)。
此外,由于请求是由 jQuery/XMLHttpRequest 发出的,因此如果执行请求或 redirect,则客户端视图不会更改。一切只在浏览器的"behind execution".
由于所有重定向都是由 XMLHttpRequest 自动执行的,并且 jQuery 无法判断是否进行了重定向,最可靠的方法(也是最可靠的方法对我来说很重要)是手动处理:
1 - 在服务器端,当未经身份验证的请求时,将自定义 header 添加到响应中,并以 200 OK
:
响应
OnRedirectToLogin = (context) =>
{
context.Response.StatusCode = (int)System.Net.HttpStatusCode.OK;
context.Response.Headers.Add("X-Unauthenticated-Redirect", "https://www.example.it/vmenu/expired.html");
return Task.CompletedTask;
}
2 - 在客户端,只需检查此自定义 header 是否存在。如果是,请使用 window.location
:
手动重定向
var redirectHeader = jqXHR.getResponseHeader('X-Unauthenticated-Redirect');
if (redirectHeader.length > 0) {
window.location = redirectHeader;
}
仅供参考,来自 XMLHttpRequest 文档:
If the origin of the URL conveyed by the Location header is same origin with the XMLHttpRequest origin and the redirect does not violate infinite loop precautions, transparently follow the redirect while observing the same-origin request event rules.
我的 web 应用程序中有一个基于 Cookie 的身份验证,子应用程序向它发出一些 ajax 请求以从数据库中获取数据。
问题是,如果用户未通过身份验证,我会在测试模式下将他重定向到 expired.html
,如果我只是 运行 在浏览器或邮递员中 api 调用 example.com/api/test
没有首先获得身份验证 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 => {
...
});
我只是从 api 收到代码为 302
的响应,以及一个 .get
到 expired.html
的代码为 304
的响应,但用户仍然没有被重定向至 expired.html
所以你可以看到 api 请求的状态代码是 302,位置应该是 expired.html
但它没有被重定向。
可能是浏览器没有自动处理 ajax 重定向,我需要通过客户端来处理(如果 status.code == 302 则重定向)或者我可以通过服务器修复它边?
这是身份验证如何进行重定向
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;
}
};
});
只是为了让这个答案更清楚:
jQuery 的 ajax 使用 XMLHttpRequest object 及其方法来执行请求。 XMLHttpRequest 将自动遵循重定向。因为是 XMLHttpRequest 做的,jQuery 的 ajax 函数甚至不知道它。它只接收最终响应,在 OP 的情况下是 200 Ok(或 304 Not Modified as OP posted)。
此外,由于请求是由 jQuery/XMLHttpRequest 发出的,因此如果执行请求或 redirect,则客户端视图不会更改。一切只在浏览器的"behind execution".
由于所有重定向都是由 XMLHttpRequest 自动执行的,并且 jQuery 无法判断是否进行了重定向,最可靠的方法(也是最可靠的方法对我来说很重要)是手动处理:
1 - 在服务器端,当未经身份验证的请求时,将自定义 header 添加到响应中,并以 200 OK
:
OnRedirectToLogin = (context) =>
{
context.Response.StatusCode = (int)System.Net.HttpStatusCode.OK;
context.Response.Headers.Add("X-Unauthenticated-Redirect", "https://www.example.it/vmenu/expired.html");
return Task.CompletedTask;
}
2 - 在客户端,只需检查此自定义 header 是否存在。如果是,请使用 window.location
:
var redirectHeader = jqXHR.getResponseHeader('X-Unauthenticated-Redirect');
if (redirectHeader.length > 0) {
window.location = redirectHeader;
}
仅供参考,来自 XMLHttpRequest 文档:
If the origin of the URL conveyed by the Location header is same origin with the XMLHttpRequest origin and the redirect does not violate infinite loop precautions, transparently follow the redirect while observing the same-origin request event rules.