Web services Angular2 ASP.NET Core AntiForgeryToken

Web services Angular2 ASP.NET Core AntiForgeryToken,web-services,angular,asp.net-core,xss,Web Services,Angular,Asp.net Core,Xss,我有一个Angular2应用程序。它正在ASP.NET 5(核心)中运行 它对工作正常的控制器进行Http调用 但现在我需要建立跨站点脚本投影 如何在每个Http请求上生成新令牌,然后在Angular2应用程序中执行AntiForgeryToken检查? 注意:Angular中的数据表单不是从MVC视图生成的,而是完全用Angular2编写的,只调用web服务 我看到的所有例子都过时了,不起作用 如何将Angular2中的AntiForgeryToken检查集成到ASP.NET 5中,其中表单是

我有一个Angular2应用程序。它正在ASP.NET 5(核心)中运行
它对工作正常的控制器进行Http调用

但现在我需要建立跨站点脚本投影

如何在每个Http请求上生成新令牌,然后在Angular2应用程序中执行AntiForgeryToken检查?

注意:Angular中的数据表单不是从MVC视图生成的,而是完全用Angular2编写的,只调用web服务

我看到的所有例子都过时了,不起作用

如何将Angular2中的AntiForgeryToken检查集成到ASP.NET 5中,其中表单是纯角度的


谢谢。

我认为您需要自定义AntiForgeryValidationToken属性,该属性支持通过标头而不是表单值发送令牌。然后将令牌添加到从Angular2应用程序到api的每个请求的头部。示例此处

要验证来自报头的令牌,可以使用以下内容:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
    public sealed class ValidateHeaderAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException(nameof(filterContext));
            }

            var httpContext = filterContext.HttpContext;
            if (httpContext.Request.Headers["__RequestVerificationToken"] == null)
            {
                httpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
                httpContext.Response.StatusDescription = "RequestVerificationToken missing.";

                filterContext.Result = new JsonResult
                {
                    Data = new { ErrorMessage = httpContext.Response.StatusDescription },
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
                return;
            }
            var cookie = httpContext.Request.Cookies[System.Web.Helpers.AntiForgeryConfig.CookieName];
            System.Web.Helpers.AntiForgery.Validate(cookie != null ? cookie.Value : null, httpContext.Request.Headers["__RequestVerificationToken"]);
        }
    }
然后只需在控制器中的方法上添加[ValidateHeaderAntiForgeryToken]。不过请注意,这是一个MVC5、ASP.NET4.5.2项目,因此您可能需要稍微修改它以适应.NETCore。我还修改了它,以便在缺少令牌时返回JSON结果,如果不处理错误响应,可以删除该部分并将其输出给用户。 此属性的核心部分的积分归为:


困难的部分是如何在纯Angular 2应用程序中生成AntiForgeryToken而不使用
@Html.AntiForgeryToken()
(不访问.cshtml文件)。我也在寻找答案。

我正在使用操作过滤器发送请求令牌。 只需将其应用于需要新的防伪令牌的操作,例如Angular2 SPA、WebAPI操作等

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class,AllowMultiple=false,Inherited=true)]
公共类AngularAntiForgeryTokenAttribute:ActionFilterAttribute
{
私有常量字符串CookieName=“XSRF-TOKEN”;
私人只读IAntiforgery antiforgery;
公共AngularAntiForgeryTokenAttribute(IAntiforgery antiforgery)
{
这个。反酒瘾=反酒瘾;
}
public override void OnResultExecuting(ResultExecutingContext)
{
base.OnResultExecuting(上下文);
如果(!context.Cancel)
{
var tokens=antiforgery.GetAndStoreTokens(context.HttpContext);
context.HttpContext.Response.Cookies.Append(
CookieName,
tokens.RequestToken,
新的CookieOptions{HttpOnly=false});
}
}
}
/*家庭控制器*/
[ServiceFilter(typeof(AngularAntiForgeryTokenAttribute),IsReusable=true]
公共IActionResult索引()
{
返回视图();
}
/*会计控制员*/
[HttpPost()]
[异名]
[ValidateAntiForgeryToken]
//发送新的防伪令牌
[ServiceFilter(typeof(AngularAntiForgeryTokenAttribute),IsReusable=true]
公共异步任务寄存器([FromBody]RegisterViewModel模型)
{
//...
返回Json(新{});
}
在启动中注册该属性,并配置Antiforgery服务以读取请求令牌表单“X-XSRF-token”头

公共类启动
{
// ...
public void配置服务(IServiceCollection服务)
{
// ...
services.addScope();
services.AddAntiforgery(选项=>
{
options.HeaderName=“X-XSRF-TOKEN”;
});
}
}

不需要自定义操作筛选器。所有这些都可以连接到Startup.cs中

using Microsoft.AspNetCore.Antiforgery;

(...)

public void ConfigureServices(IServiceCollection services)
{
  services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN");

  (...)
}

public void Configure(IApplicationBuilder app, IAntiforgery antiforgery)
{
  app.Use(next => context =>
  {
    if (context.Request.Path == "/")
    {
      //send the request token as a JavaScript-readable cookie, and Angular will use it by default
      var tokens = antiforgery.GetAndStoreTokens(context);
      context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, new CookieOptions { HttpOnly = false });
    }
    return next(context);
  });

  (...)
}
然后,在控制器中所需的就是[ValidateAntiForgeryToken]装饰器,只要您希望强制提供标记即可


作为参考,我在这里找到了这个解决方案-。

我想知道您是否找到了如何在不使用@Html.AntiForgeryToken()的情况下创建令牌的答案?关于如何在SPA中使用此方法的建议?GET操作几乎从未被命中(除了/Home/Index),如何为以后将生成POST的每个表单传递新令牌?尝试将AngularAntiForgeryTokenAttribute应用于POST端点。您应该能够在POST操作中续订令牌。我遵循了上述步骤,但收到400个错误请求。我的“post”请求作为选项:方法类型。我问了一个关于这个问题的问题—我今天发现了一些其他信息—如果您在IIS中托管,您应该在服务器上配置数据保护,以便持久保存用于生成AntiForgeryToken的密钥。如果不这样做,应用程序重新启动时令牌将变得无效。有关如何配置的信息,请参见此处-