c# - MVC 3 多角色多用户动态授权

标签 c# asp.net asp.net-mvc-3 authorization

我最近开始为 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/

相关文章:

c# - 无法将指定的节点作为该节点的有效子节点插入,因为指定的节点类型错误

c# - ASP.NET MVC3 将 REST 服务路由到 Controller

c# - 如何将 IsChecked 绑定(bind)到 ViewModel 子类

c# - 来自非托管世界的 C# 结构可以更新为 "live"吗?

mysql - asp.net:查询多个where条件

javascript - 如何将脚本、图像和 css 文件保存到浏览器缓存中?

c# - 带有破折号的 Razor 文件名

c# - Java 和 .NET 流通过 IKVM 的互操作性

C# - 仅使用 While 循环读取第一个字符

c# - 如何将字符串四舍五入到小数点后两位?