内容简介:使用 .Net Core 开发 API 时, 有些 API 是需要认证, 添加了客户端在没有认证之前, 应该返回 401 (未认证)的 HTTP 状态码, 但是在添加了 Identity 认证之后, 返回结果变成了 302 (重定向)。对于浏览器来说, 重定向是正确的, 而 Ajax 请求则会自动继续请求重定向之后的地址, 因此必须解决掉返回重定向的问题。
使用 .Net Core 开发 API 时, 有些 API 是需要认证, 添加了 [Authorize]
标记, 代码如下所示:
[Route("api/[controller]")]
[ApiController]
public class AccountController : Controller {
[HttpGet("info")]
[Authorize]
public async Task<ActionResult<AccountInfoModel>> GetInfo() { }
}
客户端在没有认证之前, 应该返回 401 (未认证)的 HTTP 状态码, 但是在添加了 Identity 认证之后, 返回结果变成了 302 (重定向)。
对于浏览器来说, 重定向是正确的, 而 Ajax 请求则会自动继续请求重定向之后的地址, 因此必须解决掉返回重定向的问题。
既然是通过添加 Identity 认证造成, 肯定要从 Identity 来找问题, 经过一番搜索, 终于在 CookieAuthenticationEvents 中找到了原因, 代码中有关于是否是 Ajax 请求的判断
public Func<RedirectContext<CookieAuthenticationOptions>, Task> OnRedirectToReturnUrl { get; set; } = context =>
{
if (IsAjaxRequest(context.Request))
{
context.Response.Headers[HeaderNames.Location] = context.RedirectUri;
}
else
{
context.Response.Redirect(context.RedirectUri);
}
return Task.CompletedTask;
};
private static bool IsAjaxRequest(HttpRequest request)
{
return string.Equals(request.Query["X-Requested-With"], "XMLHttpRequest", StringComparison.Ordinal) ||
string.Equals(request.Headers["X-Requested-With"], "XMLHttpRequest", StringComparison.Ordinal);
}
从上面的代码可以看出, 如果请求的 QueryString 或者 Header 中包含 X-Requested-With
并且值为 XMLHttpRequest
的话, 则会被判断为 AjaxRequest , 将不会返回重定向结果, 问题原因找到了, 解决方法也就有了。
对于 Angular 来说, 可以实现一个全局的 HttpInterceptor
, 来添加这个 Header , 代码如下:
export class AuthInterceptor implements HttpInterceptor {
public intercept(
req: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
if (req.url.startsWith(environment.apiUrl)) {
const request = req.clone({
withCredentials: true,
setHeaders: {
'X-Requested-With': 'XMLHttpRequest'
}
});
return next.handle(request);
}
return next.handle(req);
}
}
最后, 在 app.module.ts 中注册这个拦截器, 代码为:
import { AuthInterceptor } from './services/auth.interceptor';
@NgModule({
declarations: [
AppComponent,
],
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptor,
multi: true
}
],
bootstrap: [AppComponent]
})
export class AppModule {}
现在再次访问需要认证的 API 就不会有重定向结果返回了。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Perl语言编程
克里斯蒂安森 (Tom Christiansen) (作者)、Brian D Foy (作者)、Larry Wall (作者)、Jon Orwant (作者) / 苏金国 (译者)、吴爽 (译者) / 中国电力出版社 / 2014-9-1 / 148
从1991年第一版问世以来,《Perl语言编程》很快成为无可争议的Perl宝典,如今仍是这种高实用性语言的权威指南。Perl最初只是作为一个功能强大的文本处理工具,不过很快发展成为一种通用的编程语言,可以帮助成千上万的程序员、系统管理员,以及像你一样的技术爱好者轻松完成工作。 人们早已经翘首以待这本“大骆驼书”的更新,如今终于得偿所愿。在这一版中,三位颇有声望的Perl作者讲述了这种语言当前......一起来看看 《Perl语言编程》 这本书的介绍吧!