我正在ASP.NET / C#中设计一个Web应用程序,其中每个注册用户都可以根据用户ID添加/修改/删除行。
举个例子:
我要在属于我的页面/route.aspx?routeid=854
上编辑我的路线(用户ID:1)。
但是因为我是一个好奇的家伙,我尝试访问属于另一个用户的/route.aspx?routeid=855
(用户ID:2)。
如何最好地避免人们访问其他人的数据?我应该在每个数据库调用中发送每个用户ID(来自会话),我应该在每次加载页面时验证用户/密码还是最好和最安全的方法?
我希望我说得够清楚。
答案 0 :(得分:3)
您最好的方法是使用routeId将userId发送到数据库,以查看用户是否可以访问它。
类似的东西:
select * from route where routeId=@routeId and userId=@userId
如果您正在使用像Linq这样的东西,您可以通过应用用户限制来制作更好的安全模型,就像使用可重复使用的函数一样:
public Route Get(int routeId, int userId)
{
var query repository.Get<Route>().Where(r => r.Id == routeId);
query = applySecurityModel(query, userId);
return query.FirstOrDefault();
}
private IQueryable<T> applySecurityModel<T>(IQueryable<T> query, int userId) where T : ISecurable
{
return query.Where(t => t.UserId == userId);
}
public interface ISecurable
{
int UserId { get; set; }
}
public class Route
{
int Id { get; set; }
int UserId { get; set; }
}
答案 1 :(得分:3)
不要重新使用轮子
编辑:存储UserId - 您不必。只要用户登录,您就可以随时从MembershipProvider获取它:
MembershipUser user = Membership.GetUser();
Guid UserID = user.ProviderUserKey;
听起来像你需要实现ASP.NET成员资格提供程序。阅读此资源:http://odetocode.com/articles/427.aspx
另外,Scott Guthrie的一个很好的系列:http://weblogs.asp.net/scottgu/archive/2006/02/24/ASP.NET-2.0-Membership_2C00_-Roles_2C00_-Forms-Authentication_2C00_-and-Security-Resources-.aspx
通常,采用此方法:使用表单身份验证来验证用户是谁。这是安全性的身份验证方面。也就是说,确定用户是他们所说的人,通常使用用户名和密码。
安全性的第二部分是授权,一旦您知道用户是谁,就会发生这种情况。这基本上包括确定经过身份验证的用户可以访问哪些资源。成熟的系统将包括以下实体:
User: may contain extended profile information captured on registration
Resource: a page or other resource that can be restricted.
Group: a group of users who can access resources due to their group membership (groups are granted resource access)
Role: a type of user such as Administrator/Developer/Salesperson.
因此,要授予用户对routeid 854(资源)的访问权限,您可以直接向用户授予资源,或者如果有多个用户应该接受该资源并且这些用户形成自然组,则创建该group,将资源授予组并将用户添加到组中。
然后您可以通过资源ID访问User.Resources,也可以使用
保护整个页面if(!User.IsInRole("RoleName"))
{
//redirect to access denied page
}
使用提供者模型可以获得许多好东西。
编辑:如果您决定存储有关用户的个人资料信息,请注意以下事项:ProfileProvider的默认实现不是特别好。 Scott Guthrie写了一篇关于基于表格的提供者的好文章,该文章更好:http://weblogs.asp.net/scottgu/archive/2006/01/10/435038.aspx