所以我有我的行动方法
[Authorize(Roles="Admin")]
public ActionResult EditPosts(int id)
{
return View();
}
在我来说,我需要授权管理员,使他们可以编辑的职位,但(这里来了凉爽的一部分),我还需要允许信息的创建者才能够编辑帖子至极是一个普通用户。 所以,我怎么能滤除创建后还有管理员用户,但留下了未授权的他人? 我recieveing的后补ID作为属性附加伤害后的路由参数,但是那也只是属性不断接受参数,看起来像是很困难的,你的答案被高度赞赏,干杯!
你可以写一个自定义的授权属性:
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();
}
据我所知,你已经接受了答案,这被张贴了一段时间回来。(顺便说一句:添加自定义属性优良的答案),但是我想指出以下几点:
如果您正在使用该属性一次。 在一个单一的方法。 这不是一个很好的实施。 相反,你应该有:
[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
}
这样做的优点是:
- 无需额外的类会有人后来不知道它被使用。
- 无类,是不是其他地方使用的(你不自定义属性得到重用)
- 性能更好:后单取
- 比较容易的方式有人读/弄清楚它是如何工作的。 没有魔码追查。
- 而多年以后,当HttpContextBase类不存在,或用于获取Id参数的招数的其他部分都走了,该代码仍然有效?