【发布时间】:2010-11-29 05:37:05
【问题描述】:
我正在使用 ActionFilterAttribute 来执行自定义身份验证逻辑。该属性将仅用于包含我的身份验证逻辑的派生 Controller 类。
这是我的控制器,派生自我的自定义控制器类,以及一个示例属性:
public class MyController : CustomControllerBase
{
[CustomAuthorize(UserType = UserTypes.Admin)]
public ActionResult DoSomethingSecure()
{
return View();
}
}
这是我的 ActionFilterAttribute 的示例:
public class CustomAuthorizeAttribute : ActionFilterAttribute
{
public MyUserTypes UserType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
myUser user = ((CustomControllerBase)filterContext.Controller).User;
if(!user.isAuthenticated)
{
filterContext.RequestContext.HttpContext.Response.StatusCode = 401;
}
}
}
效果很好。
问题如下:我可以要求此属性仅用于我的自定义控制器类型中的操作吗?
【问题讨论】:
-
您的属性已损坏,因为它不继承自AuthroizeAttribute,因此不能保证在缓存操作时运行。有关使用缓存的解决方案,请参阅 blogs.teamb.com/craigstuntz/2009/09/09/38390。
-
为什么会缓存动作结果?
-
它会被缓存,因为有人告诉它被缓存。想象一下,有人将 Cache 属性放在父类上,而没有注意到子类型上的损坏属性。使用与 ASP.NET/MVC 缓存不完全不兼容的属性是一个更好的主意。有关选项,请参阅上面的链接。
-
@Craig - 很好。我实际上并没有查看动作过滤器本身。他是对的——如果你编写自己的授权操作过滤器,你真的应该从 AuthorizeAttribute 继承。然后,您可以覆盖 AuthorizeCore() 保护方法。
-
需要在这里对这个主题进行一些澄清stackoverflow.com/questions/1441799/…
标签: c# asp.net-mvc model-view-controller