【问题标题】:How can I isolate users' data in ASP.net MVC application?如何在 ASP.net MVC 应用程序中隔离用户数据?
【发布时间】:2013-12-18 21:08:22
【问题描述】:

所以我在 Azure 上部署了一个 asp.net 应用程序(使用 MVC5、ASP 4.5、EF)。该应用程序允许用户注册和登录。 但是,一旦登录,任何人都可以看到其他人的数据。

隔离属于不同用户的数据以便每个用户只能看到他/她创建的数据的最佳做法是什么?

另一个小问题是 Facebook 如何分离其用户数据?

谢谢

【问题讨论】:

    标签: asp.net azure entity-framework-5 azure-sql-database asp.net-mvc-5


    【解决方案1】:

    对于用户创建的每条数据,存储他们的用户 ID,并且只允许用户查看具有其用户 ID 的数据。举几个例子:

    SQL:

    SELECT UserDataID, Value FROM UserData WHERE UserID = @UserID;
    

    将用户的 id 传递给@UserID 参数。

    LINQ:

    using (var entityFrameworkContext = new MyDataEntities())
    {
        var currentUserData = entityFrameworkContext.UserData.Where(userData -> userData.UserID = currentUserID);
    }
    

    其中currentUserID 可以是来自表单身份验证的用户名或 ID,例如:HttpContext.Current.User.Identity.Name

    【讨论】:

    • 是的,构建多租户应用程序几乎可以归结为这一点。实现安全性也是一个好主意,这样他们就无法仅通过更改 url 来查看其他数据。您可能还想查看 SQL Azure Federations,这使得它更具可扩展性。
    【解决方案2】:

    我做到这一点的方法如下。

    在您的控制器中,您将需要使用

     public ActionResult Index()
        {
            var currentUser = manager.FindById(User.Identity.GetUserId());
            return View(db.ToDoes.ToList().Where(todo => todo.User.Id == currentUser.Id));
        }
    

    然后您还可以创建一个管理员角色,该角色可以查看用户的所有详细信息并返回ToList()。然后,您可能希望在其上放置一个 [Authorize] 方法以仅允许管理员访问。

        [Authorize(Roles="Admin")]
        public async Task<ActionResult> All()
        {
            return View(await db.ToDoes.ToListAsync());
        }
    

    我发现以下项目对理解有很大帮助。 https://github.com/rustd/AspnetIdentitySample

    希望对你有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-21
      • 2014-06-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多