我的一些控制器操作需要对用户进行身份验证。这些操作使用自定义的[Authorize]
属性进行标记。在幕后,一个自定义的成员资格提供者发挥了一些神奇的作用,其中包括将一些临时数据设置到公共线程中。
在每个需要身份验证的操作结束时,都需要调用OnActionExecuted()
过滤器来清理线程。这是通过另一个名为[CleanupContext]
的自定义属性完成的。
所以我的行为看起来是这样的:
[Authorize]
[CleanupContext]
public ViewResult Action()
{
...
}
由于这两者总是一起使用,由于我很懒,由于我担心有一天一个开发人员可能会忘记放一个或另一个,我们最终会有一些奇怪的行为:有没有办法将它们组合成一个属性
[AuthorizeAndCleanup]
public ViewResult Action()
{
// Aaah, if only it could look like this :D
}
非常感谢!
您可以从AuthorizeAttribute
派生以执行自定义授权,并实现IActionFilter
以访问OnActionExecuting
和OnActionExecuted
事件(执行自定义清理代码):
public class AuthorizeAndCleanupAttribute : AuthorizeAttribute, IActionFilter
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
// TODO: your custom authorization logic
return base.AuthorizeCore(httpContext);
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
// TODO: your custom cleanup code
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
}
}
显然,您应该意识到,如果授权失败(也称为AuthorizeCore
方法返回false),OnActionExecuting
或OnActionExecuted
事件都不会被执行,因此,如果要返回false,请确保使用此方法进行清理。
快速。我能想到的肮脏且(可能)缓慢的解决方案是跳过cleanup属性,检查OnActionExecuted()中是否存在自定义Authorize属性,并在找到任何清理代码时执行它(因为您说过它们总是一起存在)。
您应该实现自己的过滤器提供程序(http://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.html)其将自动地将CCD_ 11属性添加到由CCD_。