【问题标题】:Using Elsa workflow with antiforgery token将 Elsa 工作流程与防伪令牌一起使用
【发布时间】:2021-07-06 18:48:24
【问题描述】:

我在我的项目中使用 Elsa 工作流程。 但是当我尝试发送和保存修改后的工作流或发布工作流时,我收到了这个错误:

Error occurred: Request with status code 400 failed

因为我在启动时使用了这段代码:

 var builder = services.AddControllersWithViews(options =>
        {
            options.Filters.Add(typeof(AutoValidateAntiforgeryTokenAttribute));
            options.Filters.Add(typeof(AntiforgeryCookieResultFilterAttribute));
            options.ModelBinderProviders.Insert(0, new ServiceEndpointModelBinderProvider());
            options.Conventions.Add(new ServiceEndpointActionModelConvention());
        }).AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.ContractResolver = new DefaultContractResolver();
        });

如果我屏蔽了这两行:

options.Filters.Add(typeof(AutoValidateAntiforgeryTokenAttribute));

options.SerializerSettings.ContractResolver = new DefaultContractResolver();

我的项目会运作良好

【问题讨论】:

  • 您已标记此datacontractserializer,但AddNewtonsoftJson 启用了json.net 序列化程序,因此我将继续更新标签。
  • 如果您只删除options.Filters.Add(typeof(AutoValidateAntiforgeryTokenAttribute)); 或仅删除options.SerializerSettings.ContractResolver = new DefaultContractResolver(); 会发生什么情况,这能解决您的问题吗?还是必须同时删除它们?
  • 我的项目使用了这两个,如果我删除它们,项目的其他部分将无法正常工作
  • 但是在你写的问题中,我屏蔽了这两行......我的项目会运行良好,所以我有点困惑。您能否澄清一下是否必须删除这两行才能解决 Error occurred: Request with status code 400 failed 错误,或者仅删除其中一个就足够了?另外,你用的是什么asp.net版本?

标签: c# json.net .net-5 antiforgerytoken elsa-workflows


【解决方案1】:

启用防伪功能后,来自客户端应用(Elsa Dashboard,一种 SPA)的所有传出请求都需要提供防伪令牌。

最简单的方法可能是按照 Microsoft 的此文档提供的说明进行操作:https://docs.microsoft.com/en-us/aspnet/core/security/anti-request-forgery?view=aspnetcore-5.0#angularjs

它基本上指示您:

  1. 添加自定义 ASP.NET Core 中间件,将防伪令牌写入 cookie。
  2. 配置防伪中间件以从 cookie 中读取令牌。

或者,您可以将防伪令牌直接写入 HTML,例如当使用 Razor 页面作为 Elsa Dashboard 的主机,甚至作为 <elsa-studio-root> 元素上的属性时,进入一些隐藏的输入元素,然后使用中间件配置 Axios 客户端(Elsa 用于向服务器发出 HTTP 请求)将令牌添加为请求标头。

要为 Elsa 配置 Axios 中间件,请查看此讨论:https://github.com/elsa-workflows/elsa-core/discussions/1161#discussioncomment-963103

这是 Elsa 2.1 的一项新功能,因此在撰写本文时尚未发布。如果您想尝试,当然可以从 MyGet 获得 2.1 预发布包。

【讨论】:

  • 我不使用 Elsa 仪表板。我直接使用这个令牌:localhost:59952" workflow-definition-id="" monaco-lib-path="/js/monaco -editor/min" />
  • 同样的原则适用:<elsa-workflow-definition-editor-screen> 执行 HTTP POST 请求,您需要提供防伪令牌。
猜你喜欢
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 2015-01-11
  • 2017-10-29
  • 2019-03-05
  • 2018-01-16
  • 2013-11-27
  • 2015-05-11
相关资源
最近更新 更多