【发布时间】:2016-03-03 19:36:18
【问题描述】:
我正在开发一个 ASP.Net vNext / MVC6 项目。我开始掌握 ASP.Net Identity。
ApplicationUser 类显然是我应该添加任何其他用户属性的地方,这适用于 Entity Framework,并且我的其他属性按预期存储在数据库中。
但是,当我想从我的视图中访问当前登录用户的详细信息时,问题就出现了。具体来说,我有一个_loginPartial.cshtml,我想在其中检索并显示用户的 Gravatar 图标,为此我需要电子邮件地址。
Razor View 基类有一个 User 属性,即 ClaimsPrincipal。如何从这个User 属性返回到我的ApplicationUser,以检索我的自定义属性?
请注意,我不是在问如何找到信息;我知道如何从User.GetUserId() 值中查找ApplicationUser。这更多是关于如何明智地处理这个问题的问题。具体来说,我不想:
- 在我的视图中执行任何类型的数据库查找(关注点分离)
- 必须为每个控制器添加逻辑以检索当前用户的详细信息(DRY 原则)
- 必须为每个 ViewModel 添加一个 User 属性。
这似乎是一个“横切关注点”,应该有一个集中的标准解决方案,但我觉得我错过了一块拼图。从视图中获取这些自定义用户属性的最佳方式是什么?
注意:似乎 MVC 团队在项目模板中避开了这个问题,确保将 UserName 属性始终设置为用户的电子邮件地址,巧妙地避免了他们执行此查找以获取用户的电子邮件地址的需要电子邮件地址!这对我来说似乎有点欺骗,在我的解决方案中,用户的登录名可能是也可能不是他们的电子邮件地址,所以我不能依赖这个技巧(我怀疑我以后需要访问其他属性)。
【问题讨论】:
-
这个问题的答案很大;我现在没有时间回答,但这里有一些想法。 1. 我相信您添加的任何内容都可以在对象的某个位置访问。我过去做过,如果不追踪旧代码,我不知道在哪里。关于您的项目符号: 1. 没有更多代码,不能说,但我认为默认情况下不会发生这种情况。 2. 您可以在单个位置添加代码,以便在每次请求时检索用户;我得找个教程。 3. 您不必这样做,但您可能想要使用视图模型而不是 Identity 对象。
-
我想我可能正在做一些事情:查看组件。在 MVC6 中,这些允许部分视图拥有自己的控制器,可以将 UserManager 注入其中。需要更多的实验,除非有人先提出更好的答案,否则我会发回我的发现。
-
我可以通过多种方式看到这种情况发生。您可以使用所需的值向主体添加声明,也可以在应用程序用户上创建扩展方法以获取视图中的这些值。
-
当您提出可行的解决方案时,请更新或添加您自己的答案。谢谢。
-
在微软发布 ASP.Net 核心的 RC2 之前,我将推迟进一步的开发。
标签: c# asp.net-core asp.net-core-identity