在安全性方面,我应该向AspNetUser添加外键,并在类库

时间:2015-08-14 10:03:39

标签: c# asp.net-mvc entity-framework security asp.net-identity

在ASP.NET MVC中,您将获得存储所有用户数据的默认AspNetUsers表。

现在,在大多数项目中,您希望引用创建的用户,例如帖子。您还希望将数据库逻辑与Web逻辑分开,因此您很可能将数据库逻辑放在类库中。

但是,您遇到了一些问题:我如何引用AspNetUser?我应该将ApplicationUser移到课程库吗?我是否应该在此表中添加外键?

我已经看到很多关于 如何向AspNetUser表添加外键以及如何移动{{1}的问题和答案部分到类库,但我对以下事项的安全性有疑问:

  • 部分数据库将通过API公开,主要用于AngularJS客户端调用,但后来可能用于第三方网站。拥有一个表中ApplicationUser的外键会在GET调用中显示UserId,我已经告诉他这应该保持安全......对吗?
  • 不是以这样的方式创建的默认安全逻辑模板,应该避免修改它吗? (将UserId移至课程库)。
  • 要获取已登录的用户,您必须使用ApplicationUser,我不确定它在类库中的安全性如何,如果使用System.Web.HttpContext.Current.User.Identity.GetUserId();这有任何好处,在只应处理数据库逻辑的类库中使用它是否常见?
  • 它仍然需要web.config中的正确连接字符串,因此数据库处理仍然不能与MVC应用程序分离。
  • 根据this answer。
  • ,应避免为userId正确调用数据库

所以,让我们说这不是创建项目的好方法,我的替代方案是什么?我如何正确引用用户?

在另一个项目中,我使用了第三个表,其中包含有关用户的其他信息,其中一个字符串是电子邮件地址。此电子邮件地址是登录用户名(System.Web)的续集(且唯一)。第三个表仅通过API公开,以隐藏电子邮件地址。但它仍然需要User.Identity.Name

我向你们提出的问题是, 2015年的最佳做法是什么?

1 个答案:

答案 0 :(得分:2)

嗯,这是一个有趣的问题。以下答案基于我的观点。

  

我如何参考AspNetUser?我应该将ApplicationUser移动到   班级图书馆?

在这种情况下,您应该将ApplicationUser类作为类库项目(通常称为基础结构)的一部分。一旦使用EF,您必须拥有所有类来控制其关系。

回答这个问题:是的,你应该!

  

我是否应该在此表中添加外键?

是的,你应该!这就是为什么课程在那里,根据需要进行修改。通常,其他类具有引用ASP.NET用户的FK。

  

部分数据库将通过API公开,主要用于   AngularJS客户端调用,但后来可能是第三方调用   网站。在表中具有UserId的外键将   在GET调用中公开UserId,我被告知这应该是   保持安全......对吧?

是。 HOWEVER 您永远不应该从API 返回您的实体。您必须创建一个只包含您要显示的属性的类(或匿名类)。例如,不使用返回整个User对象,而是使用LINQ Select方法仅选择安全属性。

  

不是以这种方式创建的默认安全逻辑模板   应该避免修改吗? (将ApplicationUser移动到类   库)。

没有!该类是因为您可能需要修改它(您可以添加新属性或在关系中使用它),它不会影响安全逻辑。

  

要获取您必须使用的登录用户   System.Web.HttpContext.Current.User.Identity.GetUserId();,我是   不确定这在类库中的安全性如果是这样的话   任何好的,因为它使用System.Web,在类中使用它是很常见的   应该只处理数据库逻辑的库?

此主题可能会回答您的问题User.Identity.Name - which assembly reference brings that into your project?。在其他情况下,您从asp.net项目传递所有必要的参数。

  

它仍然需要web.config中的正确连接字符串,所以   数据库处理仍然没有真正与MVC分离   应用

是的,它仍然需要web.config中的连接字符串。这是因为连接字符串取决于启动项目。您可能有几个asp.net项目,它们具有相同的基础结构,但具有不同的数据库。

  

应该避免为userId正确调用数据库   这个答案。

是的,它应该!因为(在这种情况下)UserManager类已经有处理User实体的方法。例如:UserManager.FindById()

  

在另一个项目中,我使用了第三个表,其中包含其他表   有关用户的信息,其中一个字符串是电子邮件地址。   此电子邮件地址是登录用户名的续集(并且是唯一的)   (User.Identity.Name)。第三个表仅通过API公开   以这种方式隐藏电子邮件地址。它仍然需要   System.Web.HttpContext.Current.User.Identity.Name;虽然。

您可以在用户类中添加字符串属性来保存此信息。在您的登录逻辑中,向当前用户添加一个新的声明(在这种情况下称为电子邮件)。然后,您将能够在不查询数据库的情况下访问当前用户的电子邮件。请查看此链接How to add claims in ASP.NET Identity

希望它有所帮助!