我有一堆控制器和相关视图,需要对其应用基于角色的身份验证。我正在考虑拥有一个带有[authorize]属性定义的基础控制器,以便我可以让所有继承自该基类的控制器仅在登录后才可用。我已经测试过这个工作。我不确定这是否是最佳做法,或者是否会在这种方法下进行任何坑下降。asp.net MVC控制器和身份验证
未来我需要某些特定角色的用户才能访问某些页面。角色列表将来自数据库表。所以不是改变所有相关的控制器,而是在继承的基础控制器中进行更改。这是做这件事的正确方法吗?
谢谢你的时间。
我有一堆控制器和相关视图,需要对其应用基于角色的身份验证。我正在考虑拥有一个带有[authorize]属性定义的基础控制器,以便我可以让所有继承自该基类的控制器仅在登录后才可用。我已经测试过这个工作。我不确定这是否是最佳做法,或者是否会在这种方法下进行任何坑下降。asp.net MVC控制器和身份验证
未来我需要某些特定角色的用户才能访问某些页面。角色列表将来自数据库表。所以不是改变所有相关的控制器,而是在继承的基础控制器中进行更改。这是做这件事的正确方法吗?
谢谢你的时间。
您可以组合任意数量的Authorize
属性。
,即你可以有你的基地控制器上的Authorize
属性,另一个控制器上的更具体的一个(例如指定的角色)和一个控制器动作的最具体的一个(指定角色或用户)
[Authorize]
public class BaseController : Controller
{}
[Authorize(Roles="Administrator")]
public class AdminController : BaseController
{
[Authorize(Roles="SuperUser")]
public ActionResult SuperSecret()
{}
}
它将检查所有属性,并且只有在任何属性失败时才撤销访问。
将来我需要让特定角色中的用户可以访问某些页面。
这就是基于角色的认证的工作原理。
角色列表将来自数据库表。
将角色加载到global.asax中方法OnPostAuthenticate
中的自定义IPrincipal
中。
因此,我并没有改变所有相关的控制器,而只是在基础控制器中进行了它的继承。
我没有按照你的要求。你想避免在控制器上指定角色吗?
可以为控制器使用基本控制器类。
但是,我认为你不应该将你的控制器的继承与你的角色层次结构联系起来。它对我来说似乎并不干净。
我实现属性的继承树,如:
class NormalUserRolesAttribute: AuthorizeAttribute
class AdvancedUserRolesAttribute: AuthorizeAttribute
class AdminUserRolesAttribute: AuthorizeAttribute
略有不同OnAuthorization
行为,然后与标记这些属性的控制器。
主题起始者希望避免将角色列表附加到他的每个控制器,但要指定角色分组在其他地方。否则你的建议是完美的(并且对于授权方案是默认的) – Zruty 2012-03-06 08:01:05
嗨,是否有一个使用您在Global.asax的OnPostAuthenticate方法中提到的自定义IPrincipal的示例。据我所知iPrincipal存储一个HttpContext.Current.User对象。我如何将角色从我的AppRoles表中分配给它? – user20358 2012-03-06 12:10:58
在这里有几个例子。搜索'custom principal onpostauthenticate'或者阅读MSDN中的'IPrincipal' – jgauffin 2012-03-06 19:38:06