2

我有一堆控制器和相关视图,需要对其应用基于角色的身份验证。我正在考虑拥有一个带有[authorize]属性定义的基础控制器,以便我可以让所有继承自该基类的控制器仅在登录后才可用。我已经测试过这个工作。我不确定这是否是最佳做法,或者是否会在这种方法下进行任何坑下降。asp.net MVC控制器和身份验证

未来我需要某些特定角色的用户才能访问某些页面。角色列表将来自数据库表。所以不是改变所有相关的控制器,而是在继承的基础控制器中进行更改。这是做这件事的正确方法吗?

谢谢你的时间。

回答

7

您可以组合任意数量的Authorize属性。

,即你可以有你的基地控制器上的Authorize属性,另一个控制器上的更具体的一个(例如指定的角色)和一个控制器动作的最具体的一个(指定角色或用户)

[Authorize] 
public class BaseController : Controller 
{} 

[Authorize(Roles="Administrator")] 
public class AdminController : BaseController 
{ 
    [Authorize(Roles="SuperUser")] 
    public ActionResult SuperSecret() 
    {} 
} 

它将检查所有属性,并且只有在任何属性失败时才撤销访问。

将来我需要让特定角色中的用户可以访问某些页面。

这就是基于角色的认证的工作原理。

角色列表将来自数据库表。

将角色加载到global.asax中方法OnPostAuthenticate中的自定义IPrincipal中。

因此,我并没有改变所有相关的控制器,而只是在基础控制器中进行了它的继承。

我没有按照你的要求。你想避免在控制器上指定角色吗?

+0

主题起始者希望避免将角色列表附加到他的每个控制器,但要指定角色分组在其他地方。否则你的建议是完美的(并且对于授权方案是默认的) – Zruty 2012-03-06 08:01:05

+0

嗨,是否有一个使用您在Global.asax的OnPostAuthenticate方法中提到的自定义IPrincipal的示例。据我所知iPrincipal存储一个HttpContext.Current.User对象。我如何将角色从我的AppRoles表中分配给它? – user20358 2012-03-06 12:10:58

+0

在这里有几个例子。搜索'custom principal onpostauthenticate'或者阅读MSDN中的'IPrincipal' – jgauffin 2012-03-06 19:38:06

1

可以为控制器使用基本控制器类。

但是,我认为你不应该将你的控制器的继承与你的角色层次结构联系起来。它对我来说似乎并不干净。

我实现属性的继承树,如:

class NormalUserRolesAttribute: AuthorizeAttribute 
class AdvancedUserRolesAttribute: AuthorizeAttribute 
class AdminUserRolesAttribute: AuthorizeAttribute 

略有不同OnAuthorization行为,然后与标记这些属性的控制器。

+0

您能否解释一下与[[Authorize(Roles =“AdvancedUser”)]'有什么优势?在我看来,你只是使事情复杂化。 – jgauffin 2012-03-06 08:00:42

+0

请看我的评论给你的答案:) – Zruty 2012-03-06 08:01:57

+0

仍然。你的属性和我的建议一样。我只是推荐将角色加载到一个'IPrincipal'中,因为它被.NET中的所有安全特性所使用。 – jgauffin 2012-03-06 08:04:50