将ASP.NET MVC属性和操作筛选器注释组合在一起



我的一些控制器操作需要对用户进行身份验证。这些操作使用自定义的[Authorize]属性进行标记。在幕后,一个自定义的成员资格提供者发挥了一些神奇的作用,其中包括将一些临时数据设置到公共线程中。

在每个需要身份验证的操作结束时,都需要调用OnActionExecuted()过滤器来清理线程。这是通过另一个名为[CleanupContext]的自定义属性完成的。

所以我的行为看起来是这样的:

[Authorize]
[CleanupContext]
public ViewResult Action()
{
   ...
}

由于这两者总是一起使用,由于我很懒,由于我担心有一天一个开发人员可能会忘记放一个或另一个,我们最终会有一些奇怪的行为:有没有办法将它们组合成一个属性

[AuthorizeAndCleanup]
public ViewResult Action()
{
   // Aaah, if only it could look like this :D
}

非常感谢!

您可以从AuthorizeAttribute派生以执行自定义授权,并实现IActionFilter以访问OnActionExecutingOnActionExecuted事件(执行自定义清理代码):

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),OnActionExecutingOnActionExecuted事件都不会被执行,因此,如果要返回false,请确保使用此方法进行清理。

快速。我能想到的肮脏且(可能)缓慢的解决方案是跳过cleanup属性,检查OnActionExecuted()中是否存在自定义Authorize属性,并在找到任何清理代码时执行它(因为您说过它们总是一起存在)。

您应该实现自己的过滤器提供程序(http://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.html)其将自动地将CCD_ 11属性添加到由CCD_。

最新更新