最佳实践:剃刀页面之间的共享代码

时间:2018-11-09 15:54:33

标签: razor asp.net-core asp.net-identity razor-pages

Razor Pages的新手。我的IndexModel是绑定的List<CLPost>,其中包含“ CreatedByUserId”。身份信息完全位于另一个DBContext中,因此我无法设置与IdentityUser的实体关系。返回CreatedByUser的全名的最佳方法是什么?谢谢!

1 个答案:

答案 0 :(得分:1)

将Identity与业务环境区分开来实际上是一件好事。这样,您就可以清楚地将关注点分开。

您遇到的问题信息不属于上下文

混合这两种上下文不会帮助您,并且查询这两种上下文也不是解决方案。那么解决这个问题的最简单方法是什么? 确保信息成为上下文的一部分。

在无法访问数据的情况下,您需要对所需数据进行本地复制。因此,如果要在报告上显示用户名,则需要创建用户的本地副本,其中包括相关信息。

听起来多余吗?好吧,不是。实际上,这就是身份的运作方式。当您使用外部提供商(例如Google)登录时,将在AspNetUsers表中创建用户的本地副本。多余?不,因为您无权访问源。

与此处相同,请确保您可以使用UserManager使所有应用程序访问用户存储。但是,假设您不能做到,而且可以肯定,这不是您想要的方式。身份仅应由一个应用负责。

请注意,索赔中提供了当前用户的信息。认识到这一点很重要User.IsInRole实际上是在查看用户的角色声明,而不是AspNetUserRoles表。

对于当前用户,请确保所有声明均可用。当您需要其他用户的信息时,您需要将其存储在业务环境中。您可以选择某种策略来在用户登录时从声明中读取信息,也可以添加功能来维护用户信息。

最重要的是,您需要在业务上下文中创建一个User表,其中包含报告所需的信息。

由于它是同一上下文的一部分,因此您只需使用一个查询即可访问它。您可以添加一列以引用当前身份subjectId,即OpenIdConnect中的sub声明。为了使它与当前用户匹配。

然后,您可以基于此子项添加授权,而上下文和用户表之间没有实际关系。

也请在此处阅读我的答案,以获取有关此问题的更多想法:Is claims based authorization appropriate for individual resources