2011-10-04 84 views
3

我想制作一个自定义的AuthorizeAttribute类,如下所述:Override Authorize Attribute in ASP.NET MVC是否可以将方法参数传递给该方法的属性?

的诀窍是,被授权的用户与否不仅仅取决于他正在执行什么方法,但参数,以及:

[MyCustomAuthorize(id)] 
[HttpGet] 
public ActionResult File(Guid id) 
{ 

} 

基本上,用户将被授权看到一些文件,但不是其他人,所以我想将ID传递给我的自定义授权属性。但我似乎无法做到这一点,因为名称'id'不在范围内。

我知道我可以做的逻辑,以确保用户有权访问该文件的方法开始,但我有几种方法,都将需要这样做,并且它会更清洁,如果我可以做它作为[Authorize]属性的一部分。

回答

1

不,这不是合法的C#。

但是,您可以访问AuthorizeAttribute子类型中的RouteValues

内部,例如,OnAuthorization,你可以这样做:

object id = filterContext.RouteData.Values["id"]; 

要小心,虽然。你真的需要知道你在这里做什么。认证,授权和缓存之间的交互非常复杂。

+0

嗯,我可能没有资格在“真的知道我在做什么”类别。你会建议我只是检查他们是否有每个方法内的权限呢? – GendoIkari

+0

不一定。如果一个动作结果被缓存,当用户执行一个GET时,它将不会执行*。因此,操作中的权限检查将不会运行。通常,像角色提供商或AzMan这样的现成解决方案最适合那些不想重新发明车轮的人。 –

-2

也许2011年的最后一个答案对该版本是正确的但是它是可能的。创建一个公共int(或任何你需要的)并使用它。例如:

public class RestrictToTemplateManagers : AuthorizeAttribute 
{ 
    public string GUID { get; set; } 
} 

[RestrictToTemplateManagers(GUID="ABC")] 
public class ImportTemplatesController : Controller 
{ 

} 
+0

除了您的答案仍然限制它基于静态值,而不是传递到该方法。 –