[英]Security approach in web application
我正在用 ASP.NET / C# 设计一个 Web 应用程序,其中每个注册用户都可以根据他们的用户 ID 添加/修改/删除行。
举个例子:
我将在属于我的页面/route.aspx?routeid=854
上编辑我的路线(用户 ID:1)。
但是因为我是一个好奇的人,所以我尝试访问属于另一个用户(用户 ID:2)的/route.aspx?routeid=855
。
我怎样才能最好地避免人们访问其他人的数据? 我应该在每个数据库调用中发送每个用户 ID(来自会话),我应该在每次页面加载时验证用户/密码,还是最好和最安全的方法是什么?
我希望我说得足够清楚。
您最好的方法是将 userId 与 routeId 一起发送到数据库,以查看用户是否可以访问它。
就像是:
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; }
}
不要重新发明轮子
编辑:存储 UserId - 您不必这样做。 只要用户登录,您就可以随时从 MembershipProvider 获取它:
MembershipUser user = Membership.GetUser();
Guid UserID = user.ProviderUserKey;
在我看来,您需要实现 ASP.NET Membership Provider。 阅读此资源: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(资源)的访问权限,您可以将资源直接授予用户,或者如果有多个用户应该有权访问该资源并且这些用户形成一个自然组,然后创建该组,授予将资源添加到组并将用户添加到组。
然后您可以通过资源 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
这也是我的问题。 Keramati 先生在这里介绍的一些解决方案。
但是在 ASP.NET MVC 的防篡改隐藏字段中引入了解决方案 ID:
您可以加密模型中的关键属性值。 您可以创建自己的属性并将其用于操作,属性接受属性名称作为字符串数组中的参数,然后将视图发送到客户端。
所有提到的属性值都将被加密,当表单将数据发布到操作时,属性解密值并比较原始值和解密值。 如果两者相等,则数据正确,所有数据都可以发送到数据库,否则验证将失败。 PrimaryKey 是必不可少的,客户端可以使用检查工具和其他工具轻松操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.