单页上的CSRF使用Web Api 2后端

时间:2016-08-16 15:05:51

标签: c# antiforgerytoken

我尝试在单页面应用程序中使用.Net Framework的AntiForgeryToken实现CSRF。我在.csthml文件中实现了一些代码,并且我创建了一个AuthorizeAttribute:

Index.cshtml

<script>

    @functions{
        public string GetAntiForgeryToken()
        {
            string cookieToken, formToken;
            System.Web.Helpers.AntiForgery.GetTokens(null, out cookieToken, out formToken);
            return cookieToken + ":" + formToken;                
        }
    }

    $.ajaxPrefilter(function (options, originalOptions, jqXHR) {
        var xxx = '@GetAntiForgeryToken()';
        jqXHR.setRequestHeader("X-CSRF", xxx);
    });

</script>

ValidateHttpAntiForgeryTokenAttribute.cs

public class ValidateHttpAntiForgeryTokenAttribute : AuthorizeAttribute
{
    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        var headers = actionContext.Request.Headers;

        var headerToken = headers.Contains("X-CSRF") ? headers.GetValues("X-CSRF").FirstOrDefault() : null;

        if (headerToken == null)
        {
            return false;
        }

        var tokenValues = headerToken.Split(':');

        if (tokenValues.Length < 2)
        {
            return false;
        }
        else
        {
            var cookieToken = tokenValues[0];
            var formToken = tokenValues[1];
            try
            {
                AntiForgery.Validate(cookieToken, formToken);
            }
            catch(Exception ex)
            {
                return false;
            }
        }           
        return base.IsAuthorized(actionContext);
    }
}         

MyController.cs

    [HttpGet]
    [ValidateHttpAntiForgeryTokenAttribute]
    public HttpResponseMessage Get()
    {
     ...
    }

每次调用ValidateHttpAntiForgeryTokenAttribute时,都会出现以下错误:

The provided anti-forgery token was meant for user "CMP\usr", but the current user is "dev@company.net"

我想知道为什么它会显示计算机的用户名而不是应用程序上记录的用户名以及为什么在执行 GetAntiForgeryToken()时令牌不会改变。

提前感谢。

1 个答案:

答案 0 :(得分:0)

快速修复(如果您不关心反CSRF逻辑中的用户名验证)将是:

AntiForgeryConfig.SuppressIdentityHeuristicChecks = true

AppStart逻辑中的某个地方(global.asax)。