C# web应用中的安全方法
我正在ASP.NET/C中设计一个web应用程序,其中每个注册用户都可以根据其用户id添加/修改/删除行 举个例子: 我将在属于我的页面C# web应用中的安全方法,c#,asp.net,security,web-applications,membership-provider,C#,Asp.net,Security,Web Applications,Membership Provider,我正在ASP.NET/C中设计一个web应用程序,其中每个注册用户都可以根据其用户id添加/修改/删除行 举个例子: 我将在属于我的页面/route.aspx?routeid=854上编辑我的路线(用户id:1) 但因为我是一个好奇的人,所以我尝试访问属于另一个用户(用户id:2)的/route.aspx?routeid=855 我如何才能最好地避免人们访问其他人的数据?我是否应该在每次数据库调用时发送每个用户id(来自会话),是否应该在每次页面加载时验证用户/密码,或者什么是最佳和最安全的方法
/route.aspx?routeid=854
上编辑我的路线(用户id:1)
但因为我是一个好奇的人,所以我尝试访问属于另一个用户(用户id:2)的/route.aspx?routeid=855
我如何才能最好地避免人们访问其他人的数据?我是否应该在每次数据库调用时发送每个用户id(来自会话),是否应该在每次页面加载时验证用户/密码,或者什么是最佳和最安全的方法
我希望我已经说得够清楚了。您最好的方法是使用routeId将用户ID发送到数据库,以查看用户是否可以访问它 比如:
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; }
}
public-Route-Get(int-routeId,int-userId)
{
var query repository.Get().Where(r=>r.Id==routeId);
query=applySecurityModel(查询,用户ID);
返回query.FirstOrDefault();
}
私有IQueryable applySecurityModel(IQueryable查询,int userId),其中T:ISecurable
{
返回query.Where(t=>t.UserId==UserId);
}
公共接口不可治愈
{
int UserId{get;set;}
}
公务舱路线
{
int Id{get;set;}
int UserId{get;set;}
}
不要重新发明轮子
编辑:存储用户ID-您不必这样做。只要用户登录,您就可以随时从MembershipProvider处获得它。当然:
MembershipUser user = Membership.GetUser();
Guid UserID = user.ProviderUserKey;
听起来您需要实现ASP.NET成员资格提供程序。阅读此资源:
另外,Scott Guthrie的一个优秀系列:
通常,采用这种方法:使用表单身份验证来验证用户是谁。这是安全性的身份验证方面。也就是说,确定用户是他们所说的人,通常使用用户名和密码
安全性的第二部分是授权,一旦您知道用户是谁,就会发生授权。这主要包括确定经过身份验证的用户可以访问哪些资源。一个成熟的系统将包括以下实体:
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(资源)的访问权限,您可以直接将资源授予该用户,或者如果有多个用户应该拥有该资源的访问权限,并且这些用户构成一个自然组,则创建该组,将资源授予该组,并将用户添加到该组中
然后,您可以通过资源id访问User.Resources,也可以使用
if(!User.IsInRole("RoleName"))
{
//redirect to access denied page
}
使用提供者模型有很多好东西可用
编辑:如果决定存储有关用户的配置文件信息,需要注意的事项:ProfileProvider的默认实现不是特别好。Scott Guthrie写了一篇关于一个更好的基于表的提供者的好文章:存储此用户id的最佳方法是什么?会话?我是否应该在页面加载时验证当前用户对应于此用户id?保存用户id服务器端(例如在会话对象中)而不是客户端(例如在cookie中)。好的,我将在会话中存储该id。它足够安全吗?我是否应该在每次加载页面时刷新会话以确保用户id存在?我正在使用ASP.NET成员资格提供程序进行登录。但是很高兴看到一些关于自定义信息的信息。:-)下面我们将阅读更多这方面的内容。好东西:这里也有一些很好的示例代码:关于存储用户ID,请看我答案顶部的编辑。