我编写了一个自定义授权筛选器,用于AngularJS XSRF方法,但是没有调用该筛选器。
奇怪的是,我从另一个项目中复制了它,它似乎在那里工作得很好。
这是attrubute/filter代码。
[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中,我看不到任何显著不同的地方。
发布于 2013-10-25 12:24:32
问题是现在ASP.NET中有两个ASP.NET接口。
一个在System.Web.Mvc中用于“普通”视图控制器,另一个在System.Web.Http.Filters中用于WebAPI。
我的版本中有错误的using语句不起作用。
发布于 2013-10-25 11:14:19
有两种可能是导致这种行为的原因。
1-你在控制器中插入了一个AuthorizeAttribute。当控制器(类)和操作(方法)中具有授权时,这两者将被用于授权。首先,它被称为控制器的授权属性。如果允许访问,则称为操作的授权属性。
默认情况下,AuthorizeAttribute使用Membership,如果没有设置Membership,则该属性将拒绝您的访问,并且不会调用ValidateAngularAntiForgeryTokenAttribute。
尝试在控制器之前注释行[Authorize],然后运行一个测试,看看您的属性现在是否被调用。
2-尝试将属性转换为@siva。K说。就像这样:
[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;
}
}发布于 2015-08-12 15:32:28
这个问题是由我引起的,因为我忘了调用Application_Start中的寄存器过滤器方法.这是个愚蠢的问题,但如果它能为某人节省一天的故障排除时间,那是值得的。
protected void Application_Start(object sender, EventArgs e)
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
}https://stackoverflow.com/questions/19578557
复制相似问题