Asp.net core 以编程方式生成请求验证令牌

Asp.net core 以编程方式生成请求验证令牌,asp.net-core,asp.net-core-mvc,asp.net-core-3.1,Asp.net Core,Asp.net Core Mvc,Asp.net Core 3.1,从一个空的MVC项目开始,下面是我的Startup.cs: 使用Microsoft.AspNetCore.Builder; 使用Microsoft.AspNetCore.Hosting; 使用Microsoft.Extensions.DependencyInjection; 命名空间反伪造示例 { 公营创业 { public void配置服务(IServiceCollection服务) { services.AddMvc(); } public void配置(IApplicationBuilde

从一个空的MVC项目开始,下面是我的
Startup.cs

使用Microsoft.AspNetCore.Builder;
使用Microsoft.AspNetCore.Hosting;
使用Microsoft.Extensions.DependencyInjection;
命名空间反伪造示例
{
公营创业
{
public void配置服务(IServiceCollection服务)
{
services.AddMvc();
}
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
app.UseDeveloperExceptionPage();
app.UseStatusCodePages();
app.UseRouting();
app.UseEndpoints(端点=>
{
endpoints.MapDefaultControllerOute();
});
}
}
}
这是我的
家庭控制器.cs

使用Microsoft.AspNetCore.Mvc;
Net系统;
命名空间反伪造示例
{
公共类XYZ控制器:控制器
{
[HttpPost]
[ValidateAntiForgeryToken]
公共字符串Fgh()=>“Fgh 1”;
[HttpGet]
公共内容结果Efg()
{
返回新的ContentResult()
{
ContentType=“text/html”,
StatusCode=(int)HttpStatusCode.OK,
内容=@“
123
"
};
}
}
}
Startup.cs
中的以下行添加了防伪中间件:

services.AddMvc();
因此,如果我们转到
http://localhost:52838/Xyz/Efg
,我们只需一个按钮即可获得简单页面:

如果我们按下按钮,将得到400个“错误请求”响应:

我假设这是因为我们没有在post中传递有效的请求验证令牌。
Fgh
方法应用了
ValidateAntiForgeryToken
属性:

[HttpPost]
[ValidateAntiForgeryToken]
public string Fgh() => "fgh 1";
因此,调用此方法时需要令牌

如上所述,如果将
表单
标记帮助程序与ASP.NET Core MVC或Razor页面一起使用,则通常会自动包含此令牌的代码。它看起来像这样,并作为
表单
标记的一部分包含:

<input name="__RequestVerificationToken" type="hidden" value="CfDJ8NrAkS ... s2-m9Yw">
<input name="__RequestVerificationToken" type="hidden" value="TOKEN VALUE HERE">

我在
/r/dotnet
子Reddit上分享了这个问题

/u/kenos1
提供了一个:

您可以注入Microsoft.AspNetCore.Antiforgery.IAntiforgery并对其调用GetTokens()

以下是文档:

正如他在那里提到的,我们在
XyzController
构造函数中注入
IAntiforgery

private IAntiforgery反伪造;
公共XYZ控制器(IAntiforgery antiforgery)
{
防暴=防暴;
}
我们在注入的
IAntiforgery
实例上调用
GetAndStoreTokens

var token_set = antiforgery.GetAndStoreTokens(HttpContext);
最后,我们在生成的HTML中使用生成的标记:

返回新的ContentResult()
{
ContentType=“text/html”,
StatusCode=(int)HttpStatusCode.OK,
Content=string.Format(@)
123
",
令牌\u set.RequestToken)
};
以下是完整的控制器文件:

使用Microsoft.AspNetCore.Antiforgery;
使用Microsoft.AspNetCore.Mvc;
使用Microsoft.AspNetCore.Mvc.Rendering;
使用Microsoft.AspNetCore.Mvc.ViewFeatures;
Net系统;
命名空间反伪造示例
{
公共类XYZ控制器:控制器
{
私人安泰酒家反酒家;
公共XYZ控制器(IAntiforgery antiforgery)
{
防暴=防暴;
}
[HttpPost]
[ValidateAntiForgeryToken]
公共字符串Fgh()=>“Fgh 1”;
[HttpGet]
公共内容结果Efg()
{
var token_set=antiforgery.GetAndStoreTokens(HttpContext);
返回新的ContentResult()
{
ContentType=“text/html”,
StatusCode=(int)HttpStatusCode.OK,
Content=string.Format(@)
123
",
令牌\u set.RequestToken)
};
}
}
}

官方ASP.NET Core 3.1文档提到了
GetAndStoreTokens
方法。

我在
/r/dotnet
子Reddit上分享了这个问题

/u/kenos1
提供了一个:

您可以注入Microsoft.AspNetCore.Antiforgery.IAntiforgery并对其调用GetTokens()

以下是文档:

正如他在那里提到的,我们在
XyzController
构造函数中注入
IAntiforgery

private IAntiforgery反伪造;
公共XYZ控制器(IAntiforgery antiforgery)
{
防暴=防暴;
}
我们在注入的
IAntiforgery
实例上调用
GetAndStoreTokens

var token_set = antiforgery.GetAndStoreTokens(HttpContext);
最后,我们在生成的HTML中使用生成的标记:

返回新的ContentResult()
{
ContentType=“text/html”,
StatusCode=(int)HttpStatusCode.OK,
Content=string.Format(@)
123
",
令牌\u set.RequestToken)
};
以下是完整的控制器文件:

使用Microsoft.AspNetCore.Antiforgery;
使用Microsoft.AspNetCore.Mvc;
使用Microsoft.AspNetCore.Mvc.Rendering;