我已经阅读了有关ASP.NET MVC中的自定义授权过滤器的十几个问题,但它们都没有解决我的想法。
以下是设置:
想象一下,John试图访问http://mysite.com/BlogPosts/Edit/5,而BlogPost 5号是Mary的博客文章。约翰被授权,因为他已登录并通过了内置的授权方案,但他无权编辑Mary的blos帖子。我希望你能得到这张照片。
我知道ASP.NET MVC中的授权,我知道我可以构建自己的自定义IAuthorizationFilter。但是,我的授权过滤器必须访问数据库(在我的情况下是DbContext),以检查正在编辑/删除的实体,即BlogPost编号5是否由当前登录的用户拥有。换句话说,当前登录的用户只能编辑和删除他的“东西”。每个“东西”都知道拥有它的用户。
pseude代码中有类似的内容:
var currentlyLoggedUser = this.dbContext.UserProfiles.Single(user => user.Username == this.User.Identity.Name);
if (blogPost.UserProfile != currentlyLoggedUser)
{
// "John you are not allowed to edit someone else's blog post, you bad boy".
}
所以,我的两个简单问题是: 1. 从自定义IAuthorizationFilter 中访问数据库的“最佳实践”方法是什么?我应该以某种方式将我的IRepository(服务于我的DbContext的接口)注入授权过滤器属性?我应该尝试从我的过滤器的OnAuthorization方法中的Controller中找到我的IRepository吗?首先从过滤器中访问数据库是否可以? 2.如果使用IAuthorizationFilter执行此任务不是“最佳实践”方法,那么它是什么?
总结一下:
如果每个“东西”都知道拥有它的用户,我怎样才能确保当前登录的用户只能编辑/删除他的“东西”?
答案 0 :(得分:0)
每个帖子条目都应该有post_author_id或post_owner_id。因此,通过计算此ID和登录用户的ID,您可以有效地显示/隐藏编辑选项。
public class HomeController : Controller
{
public ActionResult Edit(int id)
{
var post = _service.GetPost(id);
var currentUser = this.dbContext.UserProfiles.Single(user => user.Username == this.User.Identity.Name);
if(post.OwnerId == currentUser.Id)
{
// Let him edit, hes the owner of the post.
return View(post);
}
else
{
// send him back to the post or do something else.
return RedirectToAction("Post", "Home");
}
}
}