2009-02-10 118 views
2

我现在的项目是使用ASP.Net MVC这我加入身份验证内置的内部Web应用程序。我有一个预先创建的HTTPModule,它创建一个具有适当角色的IPrincipal。如果用户没有通过验证,我得到的角色为“公共”ASP.Net MVC:AuthorizeAttribute可以被重写吗?

用户对象由于这是一个内部应用程序的大部分网页都是私有的,只能查看到角色“管理”。因为我有一个基本的控制器我可以这样做:

[Authorize(Roles="Admin")] 
public abstract class MyControllerBase : Controller 
{ 
    ... 
} 

我有一个问题,但因为一些动作都是可见在公众网站上,如果我的属性他们像这样:

[Authorize(Roles="Public")] 
public class LoginController : MyController 
{ 
    public ActionResult Index() 
    { 

    } 
} 

的由于用户未通过身份验证,因此无法加载页面。这似乎是“遗传被忽略的角色继承类,有没有人知道角色是否可以被遗传类覆盖?

我也试图避免归因于所有控制器与角色=”管理“

谢谢,基思。

回答

5

那么最后我想我的答案是在这个问题上。我没有将Authorize属性放在我的基础控制器上,而是派生了一个新的AdminBaseController。现在

[HandleError] 
public abstract class MyControllerBase : Controller 
{ 
    ... 
} 

[Authorize(Roles="Admin")] 
public abstract class AdminControllerBase : MyControllerBase 
{ 
    .... 
} 

任何需要验证控制器可以从AdminControllerBase得到,而我的公共控制器可以从MyControllerBase派生。 OO来拯救。

6

可以派生从AuthorizeAttribute一个新的属性和覆盖OnAuthorization方法,然后应用自定义属性,而不是授权。下面是我的自定义属性的一个重定向到一个错误的OnAuthorization方法如果页面的特权是不够的,而不是重定向到登录页面。

我不知道究竟这是什么给你买,虽然。当您使用属性装饰你的类,想必你必须同时允许管理员和公共(所以你是谁,因为限制公众人谁没有被认证?)。然后,您必须修饰每个需要单独限制到Admin的控制器方法,因为class属性允许以其他方式访问。您可以通过简单的装饰只是(即没有公开可用的方法或类)的非公开可用的方法,可以实现与常规授权属性此行为。

我想你可以让你的属性检查被调用的方法是否也装饰了属性,并简单地批准授权,这将有效地将授权延迟到方法级别。您可能需要查看AuthorizationContext上的RouteData以获取操作并使用反射来尝试查找基于参数和请求类型的适当方法。

​​
+0

感谢您的建议,我认为创建我自己的授权形式将是一条路。 我这样做是因为应用程序是内部的,它也在我们的公共网站上显示了IFrame中的地图。所以默认情况下只有管理员权限才能公开查看某些控制器。 – 2009-02-11 09:04:43

相关问题