如何实现自定义授权下列情况下属性?(How to implement custom Authoriz

2019-06-17 11:10发布

所以我有我的行动方法

[Authorize(Roles="Admin")]
public ActionResult EditPosts(int id)
{
    return View();
}

在我来说,我需要授权管理员,使他们可以编辑的职位,但(这里来了凉爽的一部分),我还需要允许信息的创建者才能够编辑帖子至极是一个普通用户。 所以,我怎么能滤除创建后还有管理员用户,但留下了未授权的他人? 我recieveing的后补ID作为属性附加伤害后的路由参数,但是那也只是属性不断接受参数,看起来像是很困难的,你的答案被高度赞赏,干杯!

Answer 1:

你可以写一个自定义的授权属性:

public class AuthorizeAdminOrOwnerOfPostAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);
        if (!authorized)
        {
            // The user is not authenticated
            return false;
        }

        var user = httpContext.User;
        if (user.IsInRole("Admin"))
        {
            // Administrator => let him in
            return true;
        }

        var rd = httpContext.Request.RequestContext.RouteData;
        var id = rd.Values["id"] as string;
        if (string.IsNullOrEmpty(id))
        {
            // No id was specified => we do not allow access
            return false;
        }

        return IsOwnerOfPost(user.Identity.Name, id);
    }

    private bool IsOwnerOfPost(string username, string postId)
    {
        // TODO: you know what to do here
        throw new NotImplementedException();
    }
}

然后用装点您的它的控制器操作:

[AuthorizeAdminOrOwnerOfPost]
public ActionResult EditPosts(int id)
{
    return View();
}


Answer 2:

据我所知,你已经接受了答案,这被张贴了一段时间回来。(顺便说一句:添加自定义属性优良的答案),但是我想指出以下几点:

如果您正在使用该属性一次。 在一个单一的方法。 这不是一个很好的实施。 相反,你应该有:

[Authorize]   // Just make sure they are auth'ed at all.
public ActionResult EditPosts(int id)
{
    Post SomePost = findPostByID (id);   // However you do it - single lookup of post

    if (!user.IsInRole("Admin") &&  !{IsOwnerOfPost(post)} )  Return Not Authorized

  ... Edit post code here
}

这样做的优点是:

  1. 无需额外的类会有人后来不知道它被使用。
  2. 无类,是不是其他地方使用的(你不自定义属性得到重用)
  3. 性能更好:后单取
  4. 比较容易的方式有人读/弄清楚它是如何工作的。 没有魔码追查。
  5. 而多年以后,当HttpContextBase类不存在,或用于获取Id参数的招数的其他部分都走了,该代码仍然有效?


文章来源: How to implement custom Authorize attribute for the following case?