【发布时间】:2020-02-13 01:51:22
【问题描述】:
我有一个用 ASP.net (v2.2) 和 Angular8 编写的应用程序。 C# 端(服务器端)只是一个向 Angular(客户端)应用程序公开功能的 Web API。
我的客户端应用程序使用 SSR(服务器端渲染)来向用户展示应用程序。
我想在我的应用程序上从 ASP.net 激活防伪机制。它应该在任何 HTTP 请求上的工作方式,我将附加一个防伪 cookie,并将在我的 web-api 控制器(服务器端\c#)上验证它。
我尝试编写一个将 cookie 附加到响应的中间件。它看起来像这样(基于this):
public class AntiForgeryTokenMiddleware
{
private readonly RequestDelegate _next;
private readonly IAntiforgery _antiforgery;
public AntiForgeryTokenMiddleware(RequestDelegate next, IAntiforgery antiforgery)
{
_next = next;
_antiforgery = antiforgery;
}
public Task Invoke(HttpContext context)
{
if (context.Request.Path.Value.IndexOf("/your api endpoint, e.g. /api", StringComparison.OrdinalIgnoreCase) != -1)
{
var tokens = _antiforgery.GetAndStoreTokens(context);
context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, new CookieOptions { HttpOnly = false, Secure = false });
}
return _next(context);
}
}
但是,我发现只有在第一次加载页面时才会发生中间件。点击链接后 - 我预计我的中间件会再次被触发,但事实并非如此。
因此,我的 AntiForgery cookie 在验证 webapi 时无效 - URL 已更改但 cookie 未更改。
如何解决这个问题?
【问题讨论】:
-
你也可以分享一下你是如何插入中间件的吗?
-
它类似于我在链接中提到的示例。 stackoverflow.com/questions/53086456/…
-
我会通过添加日志/断点来检查一些事情: - 单击链接会调用服务器吗? - 附加请求是否到达中间件,或者之前的中间件是否使请求短路? - 如果我点击中间件,
if块是否满足?
标签: c# asp.net angular asp.net-core asp.net-web-api