0

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

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

所以我的动作是这样的:

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

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

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

非常感谢!

4

3 回答 3

3

您可以从中派生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)
    {
    }
}

显然,您应该知道,如果授权失败(也就是方法返回 false),则不会执行OnActionExecuting或事件,因此如果您要返回 false,请确保在此方法中进行清理。OnActionExecutedAuthorizeCore

于 2012-07-30T11:54:52.110 回答
0

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

于 2012-07-30T11:49:59.957 回答
0

您应该实现自己的过滤器提供程序 (http://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.html),它将自动将Cleanup属性添加到任何标记为Authorize.

于 2012-07-30T11:56:11.577 回答