在我的MVC5项目中,管理员可以在控制面板中创建课程,课程存储在数据库中(目前只有2个课程)。另一方面,我可以为这些课程创建一些角色,即CanCreateMathHomework、CanCreateChemistryHomework,这样只有相关课程的教师才能使用ASP.NET Identity发布相关课程的作业。到目前为止,一切都很顺利,老师们可以公布他们的功课。
Lesson控制器:
[Authorize(Roles = "CanCreateMathHomework")]
public ActionResult CreateMathHw()
{
//code omitted for brevity
}
[Authorize(Roles = "CanCreateChemistryHomework")]
public ActionResult CreateChemistryHw()
{
//code omitted for brevity
}
然而,我想创建一个灵活的权限机制,让新建课程的教师可以发布他们的作业,而无需在数据库中创建新角色或在控制器中创建新操作。我想做的是:
1) 管理员将继续创建新课程和该课程的教师,然后一如既往地将其保存在数据库中。
2) 管理员将权限授予新建课程的教师,以便他或她能够像其他教师一样发布他或她的课程的hw。
3) 不需要在控制器中创建新的Action方法,并且一切都应该在不需要软件开发人员的情况下完成。
但是怎么做呢?有可能吗?如果是,是否可以使用全局角色和操作方法来执行此操作?我真的很困惑,任何帮助都将不胜感激。谢谢
不幸的是,Authorize不能按照您描述的方式工作。
然而,aspnet标识数据库(假设您有一个)将处理为用户、角色和其他此类有趣的身份验证信息创建表,因此您所需要做的就是在这些aspnet表和您的"xhomework"表之间创建联接,以将角色/用户链接到其他表中的项。
然后,您可以通过从现有的Authorize属性或其父属性派生来创建新属性(有关详细信息,请参阅此处:https://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.118).aspx)
这将为您提供一个"过滤器",在执行操作之前应用于请求,允许您通过覆盖OnAuthorization(请参阅此处:https://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.onauthorization(v=vs.118).aspx#M:System.Web.Mvc.AuthorizationAttribute.OnAuthorization(System.Web.Mvc.AuthoriizationContext))
从那里您只需要一个UI来管理新的联接表。