我最近开始为 MVC 3 进行开发,但从早些时候开始就拥有 C# 和 ASP.NET 方面的经验。所以我将从我想要完成的事情开始。我开发了一个用于托管文章的小型网站。我已经对站点实现了基于 SQLServer 的成员资格管理。现在我想创建一个凭证系统,限制并允许正确的用户创建、删除和更新文章。有一个简单的解决方案,就是这样做:
[Authorize(Roles="Admin")]
public ActionResult UpdateArticle(ArticleModel model, int articleid)
{
return View();
}
现在这真的很简单。我只是说只有“管理员”角色的成员才可以更新文章。但这只是静态的。所以我在我的数据库中创建了一个凭据表,最后告诉我“第 5 条可以由角色 1、2、3 和 4 以及用户 A、b 和 C 编辑”。到目前为止,一切都很好。但是我将如何使用授权解决方案来实现它?
我想做这样的事情:
[Authorize(getAuthorizedusers("update",this.articleid))]
其中 getAuthorizedusers 返回哪些用户和角色有权使用传递给它的文章 ID 更新文章。
所以我这里(至少)有两个问题: -获取授权方法以接受多个用户和角色。 - 将发送到 UpdateArticle 方法的提供的文章 ID 传递到 getAuthorizedusers 方法。
最佳答案
您可以创建自己的继承自 AuthorizeAttribute
的自定义属性,并覆盖 OnAuthorize
方法来执行您需要的操作。
这应该让你开始:
public class ArticleAuthorizeAttribute : AuthorizeAttribute
{
public enum ArticleAction
{
Read,
Create,
Update,
Delete
}
public ArticleAction Action { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
//do custom authorizization using Action and getting ArticleID
//from filterContext.HttpContext.Request.QueryString or
//filterContext.HttpContext.Request.Form
}
}
用法如下所示:
[ArticleAuthorize(Action=ArticleAuthorizeAttribute.ArticleAction.Update)]
编辑:仔细研究之后,您似乎无法将 this.articleID 传递给属性。但是,您确实可以通过 QueryString
属性或 Form
属性访问 filterContext.HttpContext.Request
中的参数,具体取决于您的方式传递值。我已适当更新代码示例。
可以找到更完整的例子here
要使用用户角色和用户列表检查授权,您可以这样做:
var allowedUsers = new List<string>();
//populate allowedUsers from DB
If (User.IsInRole("Update") || allowedUsers.Contains(User.Identity.Name))
{
//authorized
}
或者,您可以直接在一个方法中对数据库执行这两项检查,以避免进行两次调用。
关于c# - MVC 3 多角色多用户动态授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6404254/