我有一个用ASP.net(v2.2)和Angular8编写的应用程序。 C#端(服务器端)只是一个Web API,向Angular(客户端)应用程序公开功能。
我的客户端应用程序正在使用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);
}
}
但是,我发现仅在首次加载页面时才发生中间件。单击链接后-我希望中间件会再次被触发,但不是。
因此,当我的webapi验证后,我的AntiForgery Cookie无效-更改了URL,但未更改Cookie。
如何解决这个问题?
最佳答案
如果未触发中间件,则可能意味着该应用程序已在客户端中完全加载并引导。这意味着它不再使用服务器端渲染,因为所有内容现在都在浏览器中运行。如果您在浏览器的开发工具中监视“网络”选项卡,则通常可以进行验证。如果您要重新请求SPA的主脚本文件,则该应用程序尚未完成自举,您将直接从服务器获取响应。
请记住,SSR的主要用例是SEO,优化移动内容交付并加快页面的呈现和显示。 SSR不会像传统的回发一样将您的所有请求发送到服务器。它可以缓解呈现视图的要求,但不能替代客户端SPA的行为。
根据Angular2 ASP.NET Core AntiForgeryToken,您可能不必担心创建自定义中间件来处理API请求的防伪令牌。当Angular看到XSRF-TOKEN标头时,应该为您处理。