【问题标题】:ASP.NET core SPA SSR: Use AntiForgeryASP.NET 核心 SPA SSR:使用 AntiForgery
【发布时间】: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


【解决方案1】:

如果您的中间件没有被触发,这可能意味着应用程序已完全加载并在客户端中引导。这意味着它不再使用服务器端渲染,因为现在一切都在浏览器中运行。如果您在浏览器的开发工具中监控“网络”选项卡,通常可以验证这一点;如果您正在对 SPA 的主脚本文件发出新请求,则该应用尚未完成引导,您将直接从服务器获得响应。

请记住,SSR 的主要用例是用于 SEO、优化移动内容交付以及加快页面的呈现和显示。 SSR 不会像传统的回发那样让你的所有请求都发送到服务器。它可以缓解渲染视图的要求,但不能取代客户端 SPA 的行为。

根据Angular2 ASP.NET Core AntiForgeryToken,您可能无需担心创建自定义中间件来处理 API 请求的防伪令牌。当 Angular 看到 XSRF-TOKEN 标头时,它应该为您处理它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2018-08-09
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    相关资源
    最近更新 更多