. NET MVC,您将获得存储所有用户数据的默认AspNetUsers
表。
现在,在大多数项目中,您希望引用创建的用户,例如,一个帖子。您还希望将数据库逻辑与web逻辑分开,因此您很可能将数据库逻辑放在类库中。
但是,您会遇到一些问题:我如何引用AspNetUser
?我应该把ApplicationUser
移到类库吗?我应该给这个表添加外键吗?
我已经看到了许多关于如何添加一个外键到AspNetUser
表和如何移动ApplicationUser
部分到类库的问题和答案,但我对以下事情的安全性有疑问:
- 部分数据库将通过API公开,主要用于AngularJS客户端调用,但以后可能用于第三方网站。表中
- 默认的安全逻辑模板是不是以一种应该避免修改的方式创建的?(移动
ApplicationUser
到类库). - 要获得登录用户,您必须使用
System.Web.HttpContext.Current.User.Identity.GetUserId();
,我不确定这在类库中的安全性,如果这是使用System.Web
的任何好处,在应该只处理数据库逻辑的类库中使用此是否常见? - 在web中仍然需要正确的连接字符串。因此,数据库处理仍然没有真正从MVC应用程序中分离出来。
- 根据这个答案,应该避免正确调用数据库userId。
UserId
的外键将在GET调用时暴露UserId
,我被告知这应该保持安全…对吧?假设这不是创建项目的好方法,我有什么替代方法?如何正确地称呼用户?
在另一个项目中,我使用了第三个表,其中包含关于用户的附加信息,其中一个字符串是电子邮件地址。此电子邮件地址是登录的用户名(User.Identity.Name
)的后续(并且是唯一的)。第三个表仅通过API公开,其方式是隐藏电子邮件地址。但它仍然需要System.Web.HttpContext.Current.User.Identity.Name;
。
我的问题是, 2015年的最佳实践是什么?
嗯,这是一个有趣的问题。以下的答案是基于我的观点。
如何引用AspNetUser?我应该将ApplicationUser移动到类库?
在这种情况下,您应该将ApplicationUser类作为类库项目(通常称为基础设施)的一部分。一旦你使用了EF,你必须有所有的类来控制它的关系。
回答问题:是的,你应该!
我应该给这个表添加外键吗?
是的,你应该!这就是类存在的原因,可以根据需要进行修改。通常,其他类具有引用ASP的fk。网用户。
部分数据库将通过API公开,主要用于AngularJS客户端调用,但以后可能会用于第三方网站。在表中拥有UserId的外键将会在GET调用中公开UserId,我被告知应该这样做保持安全……对吧?
是的。然而, 你永远不应该从API返回你的实体。你必须创建一个类(或匿名类),它只包含你想要显示的属性。例如,使用LINQ Select方法只选择安全属性,而不是返回整个User对象。
默认的安全逻辑模板不是这样创建的吗应该避免修改它?(移动ApplicationUser到类库).
不!该类的存在是因为您可能需要修改它(您可以添加新属性或在关系中使用它),并且它不会影响安全逻辑。
要获得登录用户,您必须使用System.Web.HttpContext.Current.User.Identity.GetUserId()不确定这在类库中有多安全,如果这是任何好,因为它使用系统。Web,在类中使用它是否很常见应该只处理数据库逻辑的库?
这个线程可以回答你的问题User.Identity.Name -哪个程序集引用将其带入你的项目?在其他情况下,您可以从asp.net项目传递所有必要的参数。
在web中仍然需要正确的连接字符串。配置,所以数据库处理仍然没有真正从MVC中分离出来应用程序。
是的,它仍然需要一个连接字符串在web.config。发生这种情况是因为连接字符串依赖于启动项目。您可能有几个asp.net项目,它们具有相同的基础结构,但数据库不同。
为userId正确调用数据库应该根据
是的,它应该!因为(在这种情况下)UserManager类已经有了处理User实体的方法。例如:UserManager.FindById()
在另一个项目中,我使用了第三个表,其中包含附加的关于用户的信息,其中一个字符串是电子邮件地址。此电子邮件地址是登录的用户名的后续(并且是唯一的)(User.Identity.Name)。第三个表仅通过API公开以隐藏电子邮件地址的方式。它仍然需要System.Web.HttpContext.Current.User.Identity.Name;尽管.
可以在用户类中添加一个字符串属性来保存这些信息。在您的登录逻辑中,向当前用户添加一个新的Claim(在这种情况下称为email)。然后,您将能够访问当前用户的电子邮件,而无需查询数据库。看看这个链接如何在ASP中添加声明。净身份
希望有帮助!