[asp.net-mvc]ASP.NET MVC Antiforgery AngularJS Template 中的标记

发布时间: 2017/3/25 0:40:46
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

在 razor 视图中我可以简单地为您提供以下窗体生成 Antiforgery 令牌︰

<form .....>
    @Html.AntiForgeryToken()
</form>

如何生成这些 AntiForgeryToken 在 Razor 视图 (香草 HTML) 外?在特别是里面一个角的 Html 模板。要将值传递给角应用或不必从角的应用,以检索它打电话吗?

解决方法 1:

我发现一种变通方法使用的令牌。基本上,您需要创建一个自定义的筛选器,而不是这么 [ValidateAntiForgeryToken] 作为您的筛选器,你会有一个自定义,而不是从饼干头从令牌去捡。我不记得源我检索从它,但它在这儿。

创建了一个筛选器类。

using System;
using System.Linq;
using System.Net.Http;
using System.Web.Helpers;
using System.Web.Http.Filters;

namespace CateringApplication.Filters
{
    public sealed class ValidateCustomAntiForgeryTokenAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            if (actionContext == null)
            {
                throw new ArgumentNullException("actionContext");
            }
            var headers = actionContext.Request.Headers;
            var cookie = headers
                .GetCookies()
                .Select(c => c[AntiForgeryConfig.CookieName])
                .FirstOrDefault();
            var tokenFromHeader = "";
            if (headers.Contains("X-XSRF-Token"))
                tokenFromHeader = headers.GetValues("X-XSRF-Token").FirstOrDefault();
            AntiForgery.Validate(cookie != null ? cookie.Value : null, tokenFromHeader);

            base.OnActionExecuting(actionContext);
        }
    }
}

然后在角我使用以下检索令牌从页中,并将其添加到页眉。

app.run(['$http', function ($http) {
    $http.defaults.headers.common['X-XSRF-Token'] =
        angular.element('input[name="__RequestVerificationToken"]').attr('value');
}]);

最后更改到您筛选器︰[ValidateCustomAntiForgeryTokenAttribute]

更新 我并没有详细关于如何以及在何处我生成令牌。我生成的令牌通过 @Html.AntiForgeryToken() 在 razor 视图但现在在一种形式,意味着将为所有角模板无论路线共享此令牌,令牌是吴视图外。

官方微信
官方QQ群
31647020