ASP.NET身份的自定义授权属性

时间:2016-05-08 22:17:03

标签: c# asp.net asp.net-mvc asp.net-identity asp.net-identity-2

在我的MVC5项目中,管理员可以在控制面板中创建课程,课程存储在数据库中(目前只有2节课)。另一方面,我可以为这些课程创建一些角色,即CanCreateMathHomework,CanCreateChemistryHomework,这样只有相关课程的教师才能通过使用ASP.NET标识发布相关课程的作业。到目前为止,一切都很完美,教师可以发布他们课程的作业。

LessonController:

[Authorize(Roles = "CanCreateMathHomework")]
public ActionResult CreateMathHw()
{
    //code omitted for brevity
}


[Authorize(Roles = "CanCreateChemistryHomework")]
public ActionResult CreateChemistryHw()
{
    //code omitted for brevity
}

但是,我想创建一个灵活的权限机制,让新创建的课程的教师在不创建数据库中的新角色或Controller中的新操作的情况下发布其作业。我想要表现的是:

1)管理员将继续创建新课程和课程老师,然后将其保存在数据库中。

2)管理员向教师授予新创建的课程,以便他或她能够作为其他教师发布他或她的课程。

3)不需要在Controller中创建新的Action方法,一切都应该在不需要软件开发人员的情况下完成。

但是怎么样?可能吗?如果是这样,是否可以使用全局角色和Action方法来执行此操作?我真的非常困惑,任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

不幸的是,Authorize无法按照您描述的方式工作。

然而,aspnet身份数据库(假设您有一个)将处理为用户,角色和其他此类有趣的身份验证信息创建表,因此您需要做的就是在这些aspnet表和您的" xhomework&#之间创建联接34;用于将角色/用户链接到其他表中的项目的表。

然后,您可以通过从现有的Authorize属性或其父项派生来创建新属性(有关详细信息,请参阅此处:https://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.118).aspx

...

这会给你一个"过滤器"在Action执行之前应用于请求,允许您通过覆盖OnAuthorization来拒绝您自己的安全术语(请参阅此处:https://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.onauthorization(v=vs.118).aspx#M:System.Web.Mvc.AuthorizeAttribute.OnAuthorization(System.Web.Mvc.AuthorizationContext)

...从那里你只需要一个UI来管理新的连接表。