【问题标题】:Security approach in web applicationWeb 应用程序中的安全方法
【发布时间】:2011-02-20 19:35:48
【问题描述】:

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

举个例子:

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

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

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

我希望我已经说得够清楚了。

【问题讨论】:

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


    【解决方案1】:

    您最好的方法是将 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; }
    }
    

    【讨论】:

    • 存储此用户 ID 的最佳方式在哪里?会话?
    • 我是否应该在页面加载时验证当前用户是否与此用户 ID 相对应?
    • 保存用户 ID 服务器端(例如在 Session 对象中)而不是客户端(例如在 cookie 中)。
    • 好的,我将ID存储在会话中。是否足够安全?我是否应该在每次页面加载时刷新会话以确保用户 ID 存在?
    【解决方案2】:

    不要重新发明轮子

    编辑:存储 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

    【讨论】:

    • 我正在使用 ASP.NET MemberShip 提供程序进行登录。但很高兴看到有关自定义信息的一些信息。 :-) 打算阅读更多内容..
    • 好东西:这里也有一些很好的示例代码:asp.dotnetheaven.com/aspnet/doc/security/membership.aspx#auth
    • 关于存储 UserId,请查看我的答案顶部的编辑。
    猜你喜欢
    • 2011-07-04
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2013-08-12
    相关资源
    最近更新 更多