我在项目中使用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();
我的项目将运行良好
启用防伪时,来自客户端应用程序(Elsa Dashboard,它是一个SPA(的所有传出请求都需要提供防伪令牌。
最简单的方法可能是遵循Microsoft提供的此文档中的说明:https://learn.microsoft.com/en-us/aspnet/core/security/anti-request-forgery?view=aspnetcore-5.0#angularjs
它基本上指示你:
- 添加自定义ASP。NET核心中间件,将防伪令牌写入cookie
- 配置防伪中间件以从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的一个新功能,所以在撰写本文时还没有发布。2.1预发布包当然可以从MyGet获得,如果你想尝试的话。