代码之家  ›  专栏  ›  技术社区  ›  janhartmann

web应用中的安全方法

  •  6
  • janhartmann  · 技术社区  · 15 年前

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

    举个例子:

    /route.aspx?routeid=854 属于我的(用户id:1)。

    但因为我是一个好奇的人,所以我试图接近 /route.aspx?routeid=855

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

    我希望我说得够清楚。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Daniel Dyson    15 年前

    不要重新发明轮子

    编辑:存储用户ID-你不必。您可以随时从MembershipProvider获取它,只要用户已登录。当然:

    MembershipUser user = Membership.GetUser();
    Guid UserID = user.ProviderUserKey;
    

    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. 
    

    因此,要授予用户对routeid854(资源)的访问权,您可以直接将资源授予该用户,或者如果有多个用户应该访问该资源,并且这些用户形成一个自然组,则创建该组,将资源授予该组,并将用户添加到该组。

    if(!User.IsInRole("RoleName"))
    {
      //redirect to access denied page
    }
    

    使用provider模型有很多好处。

    http://weblogs.asp.net/scottgu/archive/2006/01/10/435038.aspx

        2
  •  3
  •   Andrew Bullock    15 年前

    最好的方法是将userId和routeId一起发送到数据库,以查看用户是否可以访问它。

    select * from route where routeId=@routeId and userId=@userId
    

    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; }
    }