Web应用程序中的安全方法

时间:2010-05-18 09:48:15

标签: c# asp.net security web-applications membership-provider

我正在ASP.NET / C#中设计一个Web应用程序,其中每个注册用户都可以根据用户ID添加/修改/删除行。

举个例子:

我要在属于我的页面/route.aspx?routeid=854上编辑我的路线(用户ID:1)。

但是因为我是一个好奇的家伙,我尝试访问属于另一个用户的/route.aspx?routeid=855(用户ID:2)。

如何最好地避免人们访问其他人的数据?我应该在每个数据库调用中发送每个用户ID(来自会话),我应该在每次加载页面时验证用户/密码还是最好和最安全的方法?

我希望我说得够清楚。

2 个答案:

答案 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

相关问题