Asp.net core 以编程方式生成请求验证令牌
从一个空的MVC项目开始,下面是我的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
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;