我有一个用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标头时,应该为您处理。

10-02 02:59