- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景:我一直在使用 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/
我是一名优秀的程序员,十分优秀!