2

我已经编写了一个自定义授权过滤器,用于 AngularJS XSRF 方法,但是过滤器没有被调用。

奇怪的是我从另一个项目中复制了它,它似乎在那里工作正常。

这是属性/过滤器代码。

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public sealed class ValidateAngularAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            string token = filterContext.RequestContext.HttpContext.Request.Headers["X-XSRF-TOKEN"];
            object sessionToken = filterContext.RequestContext.HttpContext.Session["XSRF-TOKEN"];

            if (string.IsNullOrEmpty(token) || sessionToken == null || sessionToken.ToString() != token)
            {
                throw new UnauthorizedAccessException();
            }
        }
    }

在这里,它装饰了 WebAPI 控制器中的一个动作。

[Authorize]
public class WorksOrdersController : ApiController
{        
    [HttpPost]
    [ValidateAngularAntiForgeryToken]
    public void EmailJob(int id, EmailModel model)
    {
       // do something
    }
}

我是否必须向 Web.config 添加一些内容才能使其正常工作?我在实际运行的项目的 web.config 中看不到任何显着不同的东西。

4

3 回答 3

11

问题是现在 ASP.NET 中有两个IAuthorizationFilter接口。

一种System.Web.Mvc用于“普通”视图控制器,一种System.Web.Http.Filters用于 WebAPI。

我在无效的版本中有错误的using陈述。

于 2013-10-25T12:24:32.150 回答
2

有两件事可能会导致这种行为。

1st - 你AuthorizeAttribute在你的控制器里放了一个。当您在控制器(类)和操作(方法)中有 Authorize 时,两者都将用于授权。首先它被称为控制器的授权属性。如果这允许访问,则称为操作的授权属性。

默认情况下AuthorizeAttributeMembership如果您未设置Membership此属性,则使用将拒绝您的访问并且ValidateAngularAntiForgeryTokenAttribute不会调用。

尝试在控制器之前注释该行[Authorize],然后运行测试以查看您的属性是否现在被调用。

第二- 尝试将您的属性转换为 @siva 之类的东西。克说。像这样:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class ValidateAngularAntiForgeryTokenAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var token = httpContext.Request.RequestContext.HttpContext.Request.Headers["X-XSRF-TOKEN"];
        var sessionToken = httpContext.Request.RequestContext.HttpContext.Session["XSRF-TOKEN"];

        if (string.IsNullOrEmpty(token) || sessionToken == null || sessionToken.ToString() != token)
        {
            return false;
        }

        return true;
    }
}
于 2013-10-25T11:14:19.240 回答
0

这个问题是由我引起的,因为我忘记在 Application_Start 中调用 register filters 方法......一个愚蠢的问题,但如果它可以为某人节省一天的故障排除时间,那么它是值得的。

protected void Application_Start(object sender, EventArgs e)
{
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
}
于 2015-08-12T15:32:28.143 回答