我可以从派生的AuthorizeAttribute访问我的控制器/动作/动词吗?

时间:2009-11-18 18:49:48

标签: c# .net asp.net-mvc

作为一个理论练习,帮助我学习与MVC相关的会员模型的细节我想知道我是否可以从外部资源加载权限,为了我的原型,我有一个单位具有如下列表的文件:

Controller1,Method1,Get,Anonymous
Controller1,Method1,Post,User,Administrator
Controller2,Method1,Get,Administrator
Controller2,Method1,Post,Administrator
Controller2,Method2,Get,User,Editor,Administrator
Controller2,Method2,Post,Editor,Administrator

我可以使用正则表达式解析,以便为我提供一个对每个控制器/动作/动词组合具有权限的角色列表。

我有我的控制器动作:

[CustomAuthorize]
public ActionResult Index()
{
    /* Do stuff */
}

我也有我的自定义授权组件:

public class CustomAuthorize : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        /* How do I access which Controller/Action/Verb fired this? */
    }
}

为了能够动态确定哪些角色可以访问此控制器/动作/动词,我需要能够确定哪个控制器/动作/动词称为CustomAuthorize属性。

我知道我可以像我这样添加属性:

public class CustomAuthorize : AuthorizeAttribute
{
    public string Controller { get; set; }
    public string Action { get; set; }
    public string Verb { get; set; }
}

然后使用:

调用我的属性
[CustomAuthorize(Controller="Home",Action="Index",Verb="Get")]
public ActionResult Index()
{
}

但这似乎是一个维持头痛的问题。如果我可以使用[Authorize]并让我的CustomAuthorize.AuthorizeCore方法确定哪个控制器/动作/动词在AuthorizeCore方法中引用它,那将是很好的。

这可能吗?如果是这样,有人能指出我正确的方向,我将如何实现这一目标吗?

2 个答案:

答案 0 :(得分:5)

您可能希望查看覆盖OnAuthorization。它获取一个AuthorizationContext参数,该参数具有对Controller和RouteData的引用。但是,看看标准的AuthorizeAttribute做了什么,特别是在缓存方面。您可以在我blog上撰写的关于customizing authorization in MVC的文章中找到一些想法。

答案 1 :(得分:3)

尝试改写OnAuthorization。

public class TestAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        string controllerName = filterContext.RouteData["controller"];
        string actionName = filterContext.RouteData["action"];
        string verb = filterContext.HttpContext.Request.HttpMethod;

        // .. do your processing
        // if fail...
        filterContext.Result = new HttpUnauthorizedResult();

        base.OnAuthorization(filterContext);
    }
}