命令等同于asp.net-core中的AntiForgery.Validate()

时间:2016-11-10 23:20:24

标签: c# asp.net-core asp.net-core-mvc .net-core antiforgerytoken

在asp.net-core中存在一个类似于AntiForgery.Validate();的命令来验证动作体中的防伪令牌?

dotnet 4.5.1中的代码示例:

public ActionResult Index()
{
    if (!User.Identity.IsAuthenticated)
    {
        System.Web.Helpers.AntiForgery.Validate();
    }

    // rest of action
}

3 个答案:

答案 0 :(得分:2)

根据Daniel的回答,我将代码更改为

[HttpPost]
[AllowAnonymous]
[IgnoreAntiforgeryToken]
public ActionResult Index()
{
    if (!User.Identity.IsAuthenticated)
    {
        return NewIndex();
    }

    // rest of action
}

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult NewIndex()
{
    // body of new action
}

另一个基于docs draft的选项是将Antiforgery作为服务注入。

Project.json

"Microsoft.AspNetCore.Antiforgery": "1.0.0" 

Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IAntiforgery antiforgery)
{
    ...


public void ConfigureServices(IServiceCollection services)
{
    services.AddAntiforgery();
    ...

然后在控制器上验证。

public class MyController : Controller
{
    private readonly IAntiforgery _antiforgery;

    public AccountController(IAntiforgery antiforgery)
    {
        _antiforgery = antiforgery; 
    }

    public ActionResult Index()
    {
        if (!User.Identity.IsAuthenticated)
        {
            await _antiforgery.ValidateRequestAsync(HttpContext);
        }

        // rest of action
    }

}

答案 1 :(得分:1)

防伪令牌由FormTagHelper自动生成并添加。 您可以通过添加asp-antiforgery="true"属性来禁用/启用此自动功能:

<form asp-controller="Account" asp-action="LogOff" asp-antiforgery="true" 
      method="post" id="logoutForm" class="navbar-right">
</form>

答案 2 :(得分:1)

可以使用控制器中的过滤器属性自动完成防伪签名验证。

  • 使用[AutoValidateAntiforgeryToken]验证所有&#34;不安全&#34;上的令牌方法。 (GET,HEAD,TRACE,OPTIONS以外的方法)。
  • 使用[ValidateAntiforgeryToken]始终验证令牌
  • 使用[IgnoreAntiforgeryToken]忽略令牌验证

您可以组合这些属性以获得所需的粒度。例如:

//Validate all 'unsafe' actions except the ones with the ignore attribute
[AutoValidateAntiforgeryToken]
public class MyApi: Controller
{
    [HttpPost]
    public IActionResult DoSomething(){ }
    [HttpPut]
    public IActionResult DoSomethingElse(){ }

    [IgnoreAntiforgeryToken]   
    public IActionResult DoSomethingSafe(){ }
}

//Validate only explicit actions
public class ArticlesController: Controller
{
    public IActionResult Index(){ }

    [ValidateAntiforgeryToken]
    [HttpPost]   
    public IActionResult Create(){ }
}

我注意到docs site中的文档还没有完全准备就绪,但您可以在github issue中看到它的草稿。