gpt4 book ai didi

asp.net-mvc - 防止授权用户编辑不属于他的数据

转载 作者:太空狗 更新时间:2023-10-30 01:58:23 25 4
gpt4 key购买 nike

我已经阅读了十几个关于 ASP.NET MVC 中的自定义授权过滤器的问题,但没有一个能解决我的想法。

这是设置:

  • ASP.NET MVC 4 项目
  • UserProfiles 存储在数据库 (EF5) 中,并通过 WebSecurity.InitializeDatabaseConnection 链接到 SimpleMembershipProvider。所以我总能得到一个基于 User.Identity.Name 的 UserProfile
  • 每个用户实体都有一个一对多关系的 BlogPost 集合。
  • 每个 BlogPost 通过 UserProfile 属性“知道”拥有它的用户(感谢 EF!)。

假设 John 试图访问 http://mysite.com/BlogPosts/Edit/5第 5 条 BlogPost 是 Mary 的博客文章。 John 已登录并通过了内置授权方案,因此获得了授权,但他无权编辑 Mary 的 blos 帖子。我希望你能明白这张照片。

我了解 ASP.NET MVC 中的授权,我知道我可以构建自己的自定义 IAuthorizationFilter。但是,我的授权过滤器必须访问数据库(在我的例子中是 DbContext),以检查正在编辑/删除的实体是否为当前登录用户所有,即 BlogPost 编号 5。也就是说,当前登录的用户只能编辑和删除他的“东西”。每个“东西”都知道拥有它的用户。

伪代码是这样的:

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 服务的接口(interface))注入(inject)授权过滤器属性?我应该尝试从我的过滤器的 OnAuthorization 方法中的 Controller 中找到我的 IRepository 吗?首先从过滤器中访问数据库是否可以?2. 如果为此任务使用 IAuthorizationFilter 不是执行此操作的“最佳实践”方法,那么什么才是?

总结一下:

如果每个“资料”都知道拥有它的用户,我如何确保当前登录的用户只能编辑/删除他的“资料”?

最佳答案

同时查看 BlogEngine.NET 的源代码和 DotNetNuke

每个帖子条目都应该有一个 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");
}
}
}

关于asp.net-mvc - 防止授权用户编辑不属于他的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13084523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com