Javascript 每个API调用必须具有唯一的AddAntiForgery令牌吗?

Javascript 每个API调用必须具有唯一的AddAntiForgery令牌吗?,javascript,asp.net,asp.net-mvc,antiforgerytoken,Javascript,Asp.net,Asp.net Mvc,Antiforgerytoken,我知道在表单中调用Html.AddAntiForgeryToken会起作用。 但对于没有形式的情况,应在何处/如何获得防伪代币 每个令牌必须是唯一的吗?或者web应用程序可以在其整个会话中使用相同的antiforgery令牌吗?AntiForgeryToken值属于page而不是form。如果使用@Html.AntiForgeryToken()在同一页面上放置多个表单(当然不是嵌套的!!!那么所有值都是相同的。重新加载页面时(在GET或POST之后),值会发生变化。 在内部,Web服务器设置Ht

我知道在表单中调用Html.AddAntiForgeryToken会起作用。 但对于没有形式的情况,应在何处/如何获得防伪代币


每个令牌必须是唯一的吗?或者web应用程序可以在其整个会话中使用相同的antiforgery令牌吗?

AntiForgeryToken值属于page而不是
form
。如果使用
@Html.AntiForgeryToken()
在同一页面上放置多个表单(当然不是嵌套的!!!那么所有值都是相同的。重新加载页面时(在
GET
POST
之后),值会发生变化。
在内部,Web服务器设置
HttpOnly
Cookie(在
AntiForgeryConfig
class中定义的名称),并将收到的值与该Cookie值进行比较。
如果从该页面进行API(AJAX)调用会怎么样?当然,您可以打任意多的电话。
如果页面上没有
表单
,该怎么办?您需要添加一个假的
表单
。像这样的

@{
    var attr = new Dictionary<string, object>();
    attr.Add("id", "anti-forgery"); //sic!
}
@using (Html.BeginForm("", "fake-form", FormMethod.Post, attr))
{
    @Html.AntiForgeryToken()
}
现在,您只需使用此属性装饰控制器方法

[HttpPost]
[ValidateJsonAntiForgeryToken] //this one
public async Task<JsonResult> ProcessRq(MyModel model)
{
    //do work
}
[HttpPost]
[ValidateJsonAntiForgeryToken]//这个
公共异步任务进程RQ(MyModel模型)
{
//工作
}

如果您创建一个纯API(RESTfull)服务,那么也有类似的方法。客户端应用程序首先必须请求并接收某种身份验证令牌,然后将其添加到所有后续请求中(在会话期间)。

您试图用
AntiForgeryToken解决什么问题?
?我想知道在用户会话中是否可以将相同的有效令牌用于我的所有http请求(只要会话仍然有效)。我想最大的问题是:Antifforgery令牌可以在表单之外生成吗?在这种情况下,它被称为
API密钥
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public class ValidateJsonAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        var httpContext = filterContext.HttpContext;
        var cookie = httpContext.Request.Cookies[AntiForgeryConfig.CookieName];
        AntiForgery.Validate(cookie != null ? cookie.Value : null, httpContext.Request.Headers["__RequestVerificationToken"]);
    }
}
[HttpPost]
[ValidateJsonAntiForgeryToken] //this one
public async Task<JsonResult> ProcessRq(MyModel model)
{
    //do work
}