我有一个.net核心2. * API和一个Angular 6. *应用程序,我正在尝试防御XSRF攻击。
登录时,我们获得一个auth令牌,然后再次调用以获取XSRF令牌。
在客户端,我们有一个HTTP拦截器,它将令牌附加到对API的所有后续请求的标头中。
API代码看起来正确,我可以看到响应头包含一个XSRF令牌,但是,一旦对API Request.Headers [“ X-XSRF-TOKEN”]进行后续请求时,是空的。
有人可以告诉我我哪里出了问题吗?
我一直在关注此示例:https://www.blinkingcaret.com/2018/11/29/asp-net-core-web-api-antiforgery/
API控制器
[ApiController]
public class AntiForgeryController : Controller
{
private IAntiforgery _antiForgery;
public AntiForgeryController(IAntiforgery antiForgery)
{
_antiForgery = antiForgery;
}
[Route("api/antiforgery")]
[IgnoreAntiforgeryToken]
public IActionResult GenerateAntiForgeryTokens()
{
var tokens = _antiForgery.GetAndStoreTokens(HttpContext);
Response.Cookies.Append("XSRF-REQUEST-TOKEN", tokens.RequestToken, new Microsoft.AspNetCore.Http.CookieOptions
{
HttpOnly = false
});
return NoContent();
}
}
UI服务方法。
getAntiForgeryToken(): any {
return this.http.get(`${this.baseURL}/antiforgery`).pipe(map(x => {
return true;
}));
}
UI http拦截器。
export class AddCsrfHeaderInterceptorService implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
let requestToken = this.getCookieValue('XSRF-REQUEST-TOKEN');
return next.handle(req.clone({
headers: req.headers.set('X-XSRF-TOKEN', requestToken)
}));
}
private getCookieValue(cookieName: string) {
const allCookies = decodeURIComponent(document.cookie).split('; ');
for (let i = 0; i < allCookies.length; i++) {
const cookie = allCookies[i];
if (cookie.startsWith(cookieName + '=')) {
return cookie.substring(cookieName.length + 1);
}
}
return '';
}
}