首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释MVC授权属性如何执行类似AOP的操作。

解释MVC授权属性如何执行类似AOP的操作。
EN

Stack Overflow用户
提问于 2014-01-22 16:54:24
回答 1查看 940关注 0票数 5

我一直在试图弄清楚这在低层次上是如何运作的:

代码语言:javascript
复制
[Authorize]
public ActionResult Index()
{
    return View();
}

基本上,上面的代码片段似乎拦截对Index方法的调用,执行授权检查,如果没有授权则抛出和异常。异常将防止调用Index方法中的代码。

这看上去很像AOP,而且在C#中做起来并不容易。如果我要实现扩展System.Attribute的自己的类,我就没有任何接口可以连接到我的属性修饰的方法的前后调用。那么MVC授权属性是如何做到这一点的,我如何才能独自完成它呢?

PostSharp是一个使用IL编织完成相同功能的库。基本上,在编译时,PostSharp扫描程序集以查找带有特定属性的方法,然后重写代码,将方法调用与其他方法调用包装起来。

MVC框架也在编译时执行某种IL编织吗?我可以自己做IL编织吗?还是有其他技术可以应用相同的AOP原理而不需要复杂的IL编织?

我试图找到关于IL编织的信息,但我发现的都是关于PostSharp的文章。我宁愿远离PostSharp,因为许可证问题,但我只是想知道,他们是如何为我自己的发展,作为一个开发人员。很吸引人。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-22 17:38:07

理解它的最简单的方法是查看源代码。

一个基本的解释是,mvc控制器的调用并不像instance.method那样简单(在这种情况下,您需要后置锐利才能使属性以相同的方式工作)

有一个ControllerActionInvoker,它具有以下方法

代码语言:javascript
复制
 public virtual bool InvokeAction(ControllerContext controllerContext, string actionName)
 {
    ...
    // get all the filters (all that inherit FilterAttribute), inlcuding the authorize attribute
    FilterInfo filterInfo = GetFilters(controllerContext, actionDescriptor); 

首先,继承IAuthorizationFilter的所有过滤器都在执行(Authorize, ValidateAntiForgeryToken)之后,如果auth成功了,其余的就会执行。

代码语言:javascript
复制
AuthorizationContext authContext = InvokeAuthorizationFilters(controllerContext, filterInfo.AuthorizationFilters, actionDescriptor);
    //authContext.Result has value if authorization didn't succeed
if (authContext.Result != null)
{
    // the auth filter signaled that we should let it short-circuit the request
    InvokeActionResult(controllerContext, authContext.Result);
}
else
{
    if (controllerContext.Controller.ValidateRequest)
    {
        ValidateRequest(controllerContext);
    }

    IDictionary<string, object> parameters = GetParameterValues(controllerContext, actionDescriptor);

    //invoke the action with filters here
    ActionExecutedContext postActionContext = InvokeActionMethodWithFilters(controllerContext, filterInfo.ActionFilters, actionDescriptor, parameters);
    InvokeActionResultWithFilters(controllerContext, filterInfo.ResultFilters, postActionContext.Result);
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21289080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档