我最近开始从事MVC 3的开发工作,但是从较早的时候开始就拥有C#和ASP.NET的经验。所以我将从我要完成的事情开始。我已经开发了一个用于托管文章的小型网站。我已经对该站点实现了基于SQLServer的成员资格管理。现在,我想创建一个凭证系统,该凭证系统将限制并允许合适的用户创建,删除和更新文章。有一个简单的解决方案,就是这样做:

[Authorize(Roles="Admin")]
    public ActionResult UpdateArticle(ArticleModel model, int articleid)
    {
        return View();
    }

现在,这真的很简单。我只是说,只有角色为“管理员”的成员才能更新文章。但这只是静态的。因此,我在数据库中创建了一个凭据表,最后告诉我“可以由角色1,2,3和4以及用户A,b和C编辑第5条”。到目前为止,一切都很好。但是我将如何使用授权解决方案来实现呢?

我想做这样的事情:
[Authorize(getAuthorizedusers("update",this.articleid))]

其中getAuthorizedusers返回授权哪些用户和角色使用传递给它的articleid更新文章。

所以我这里(至少)有两个问题:
-获取Authorize方法以接受多个用户和角色。
-将提供的商品ID(已发送到UpdateArticle方法)传递给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传递给该属性。但是,您确实可以通过filterContext.HttpContext.Request属性或QueryString属性访问Form中的参数,具体取决于传递值的方式。我已经适当地更新了代码示例。

可以找到更完整的示例here

要使用用户角色和用户列表检查授权,请执行以下操作:
        var allowedUsers = new List<string>();
        //populate allowedUsers from DB

        If (User.IsInRole("Update") || allowedUsers.Contains(User.Identity.Name))
        {
            //authorized
        }

或者,您可以直接在单个方法中对数据库进行两项检查,以防止进行两次调用。

10-07 13:55
查看更多