Asp.net 确保登录用户只查看其数据的最佳方法

Asp.net 确保登录用户只查看其数据的最佳方法,asp.net,asp.net-mvc,asp.net-mvc-3,security,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Security,这听起来像是个愚蠢的问题,但我只是想知道我是否错过了一个技巧 场景是,我有一个使用简单Memebership的web应用程序,用户可以注册使用它(例如发票程序) 但是,他们应该只能查看/更新/删除自己添加到数据库/web应用程序中的信息 确保用户只能访问其信息的最佳方式是什么 是否为每个表添加用户名字段,例如: public class Invoice { public int InvoiceId { get; set; } public int CustId { get;

这听起来像是个愚蠢的问题,但我只是想知道我是否错过了一个技巧

场景是,我有一个使用简单Memebership的web应用程序,用户可以注册使用它(例如发票程序)

但是,他们应该只能查看/更新/删除自己添加到数据库/web应用程序中的信息

确保用户只能访问其信息的最佳方式是什么

是否为每个表添加用户名字段,例如:

public class Invoice
{
     public int InvoiceId { get; set; }
     public int CustId { get; set; }
     public string UserName { get; set; }
}

public class Item
{
   public int ItemId { get; set; }
   public int InvoiceId { get; set; }
   public string UserName { get; set; }
}
…然后在任何访问数据的控制器中,只需在每个查询中添加用户名检查,例如:

var Inv = db.Invoices.Where(x => x.UserName = User.Identity.Name);
var Itm = db.Items.Where(y => y.UserName = User.Identity.Name);
这就是我目前正在使用的,但我想知道这是否是最佳实践?或者如果有一个更简单的方法我们现在在MVC4上

最好使用UserProfile表中的UserNameUserId,还是这很重要

更新以增加以下评论的清晰度

因此,10个用户已经注册,并且都创建了自己的发票。我不希望任何用户看到任何其他用户的发票

谢谢你的建议

标记

您可以将过滤器添加到global.asax文件中,以保护每个控制器的每个操作方法

控制器无需授权:

 [AllowAnonymous]
 public ActionResult LogOn() 
我想做的事情是:

  • 避免在post/query字符串中传递任何形式的用户id/credential,将其保存在安全的地方,就像在cookie中加密一样,并且在构建查询时始终使用该用户id/credential

  • 如果您将id作为编辑的一部分传递回您的程序,请确保这些值未被篡改;如果您在隐藏字段中输出id,请确保其返回时与输出时相同(这称为直接引用攻击)

  • 如果您的应用程序请求编辑,例如client/edit/4,请始终确保id 4属于该用户,然后再显示它


  • 这里有一些关于前10个漏洞的好文章:

    如果您正确设置了数据库关系,您应该能够参考用户的发票,例如:

    var invoices = dbContext.Users.first(u=>u.id == idParam).Invoices;
    
    您可以通过测试验证发票是否属于用户

    if(dbContext.Invoices.Any(i=>i.invoiceID))//invoice exists?
    {
        //Invoice belongs to user?
        bool invoiceBelongsToUser = dbContext.Users.first(u=>u.id == idParam)
        .Invoices.Any(i=>i.invoiceID == invoiceIDParam);
    }
    

    我不认为这需要在代码级别上完成,而是在数据库级别上完成。如果一个用户发布了一些东西,最好的方法就是将该帖子链接到该用户。如果用户浏览该网站,查询应该检索与该用户相关的所有信息,因此您不必在代码中处理这些信息。除了代码之外,您如何在其他任何地方进行查询?数据库不知道用户是谁,他们会吗(如果我没听清你的话,很抱歉)。谢谢在应用程序中的某个时候,您需要检索用户可以看到的信息。此时,您已经知道用户是谁,因为他们已登录,所以您至少应该有一个用户ID。现在,当您检索信息时,使用该用户ID执行查询,并将信息链接到正确的用户。您已经完成的工作。根据您的特定场景,保护表行不受未授权用户攻击的最佳方法是为每个用户的每个记录添加标签。在使用字符串(用户名)或int(UserId)之间,我会选择int,因为它在查询中更有用-在连接中性能更高。谢谢-我很感激。嗨-如果我想“清除”,我很抱歉-如果有两个用户,或者200个用户都在创建他们自己的发票——我的问题是如何最好地阻止他们每次看到别人的发票。谢谢。“在cookie中加密”仍然不是一个安全的地方。嗨-我正在使用ASP.Net/MVC4-以及反伪造令牌和授权属性等-因此我希望它在其框架内存储维护“登录用户”详细信息所需的任何内容,而不是将其暴露给客户端。我错了吗?防伪令牌所做的只是防止xss攻击,您仍然需要防止dra的攻击