在ASP.NET MVC中,您将获得存储所有用户数据的默认AspNetUsers
表。
现在,在大多数项目中,您希望引用创建的用户,例如帖子。您还希望将数据库逻辑与Web逻辑分开,因此您很可能将数据库逻辑放在类库中。
但是,您遇到了一些问题:我如何引用AspNetUser
?我应该将ApplicationUser
移到课程库吗?我是否应该在此表中添加外键?
我已经看到很多关于 如何向AspNetUser
表添加外键以及如何移动{{1}的问题和答案部分到类库,但我对以下事项的安全性有疑问:
ApplicationUser
的外键会在GET调用中显示UserId
,我已经告诉他这应该保持安全......对吗?UserId
移至课程库)。ApplicationUser
,我不确定它在类库中的安全性如何,如果使用System.Web.HttpContext.Current.User.Identity.GetUserId();
这有任何好处,在只应处理数据库逻辑的类库中使用它是否常见?所以,让我们说这不是创建项目的好方法,我的替代方案是什么?我如何正确引用用户?
在另一个项目中,我使用了第三个表,其中包含有关用户的其他信息,其中一个字符串是电子邮件地址。此电子邮件地址是登录用户名(System.Web
)的续集(且唯一)。第三个表仅通过API公开,以隐藏电子邮件地址。但它仍然需要User.Identity.Name
。
我向你们提出的问题是, 2015年的最佳做法是什么?
答案 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
希望它有所帮助!