gpt4 book ai didi

c# - 如何限制用户只能使用 Linq To SQL 编辑他们的数据?

转载 作者:行者123 更新时间:2023-11-30 21:06:02 24 4
gpt4 key购买 nike

背景:我一直在使用 C# 在 ASP.NET 4.0 中开发一个小型概念验证 Web 应用程序,并且我一直在使用 Linq To SQL,因为它既快速又简单。我现在必须限制一个用户在同一数据库中查看另一个用户的数据。所以我在我的大部分表格中添加了一个“帐户”列,我想在允许他们访问之前检查当前用户是否与他们正在查看/编辑的数据属于同一帐户。

一个我不太满意的可能解决方案:我可以简单但痛苦地完成我所有的 Linq To SQL 查询并添加一个 if 语句来进行检查,如下所示:

MyDataContext DB = new MyDataContext();
//get the current user's information from the DB
USER myUser = DB.USERs.Where(j => j.USR_EMAIL == User.Identity.Name).FirstOrDefault();
//get the object to edit
MYOBJECT myObject= DB.MYOBJECTs.Where(j => j.ID == IdFromQueryString).FirstOrDefault();
//compare the user's account with the object's account they are now trying to view
if(myUser.AccountID == myObject.AccountID)
{
//display the object
}
else
{
//display error message
}

这将是整个应用程序中要做的大量工作,更不用说重复和出错的机会了。维护起来也很痛苦,如果我忘记为查询添加它,我将留下一个安全漏洞。

问题:有没有一种方法可以为每个表执行一次,并且每次我使用 Linq To SQL 进行查询时它都会自动检查?或者有没有更好的方法来解决这个问题?

最佳答案

你应该使用 Repository模式并且不直接访问 Contest.Users,但始终访问 Repository.Users。然后,您可以更改存储库以将 Users 公开为 from u in InternalContext.Users where u.AccountId = currentAccountId select u 从而强制执行范围。巧合的是这个技术是called a scope in Rails ...

下一个最好的办法是使用 DataLoadOptions要将 lambda 过滤器与您的实体相关联,请参阅 How to: Filter at the DataContext Level (LINQ to SQL) .您需要将其添加到您创建的每个上下文中。同样,重构代码以从方法中获取数据上下文(或者更好的是,实现存储库模式...)会有很大帮助。

最后,您可以在后端通过可更新 View 和 context_info() 实现这一点但我强烈反对这样做。

附言。我希望您将 account_id 设为表上每个聚集索引中最左边的键,并使实体 id 成为非聚集主键,对吗?否则你的表现会下降。

关于c# - 如何限制用户只能使用 Linq To SQL 编辑他们的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11406841/

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