ASP.net核心身份2.0:使用数据库查找使用声明身份的正确方法?

时间:2018-01-14 17:04:19

标签: entity-framework asp.net-identity entity-framework-core claims-based-identity asp.net-core-identity

我对基于声明的身份概念感到陌生,所以如果问题不清楚,请告诉我。

我有一个派生用户集合,它与一个"组织"采集。用户可以是相关组织的管理员。

我试图构建具有[IsAdminForThisOrg]属性的能力,该属性适用于以下路线:

.../api/Organizations/1/UpdateData

首先,我正在思考"角色" vs"声称"。如果您是管理员,完全停止(不考虑事实上,您的管理员权力仅适用于特定组织),似乎角色会更合适。

然后,阅读更多,似乎声称非常适合我想要完成的事情。我的想法是,在登录时,我会查找用户是管理员的所有组织,然后使用这些值的string.concat设置声明。然后,我可以围绕这个主张制定政策。

问题1

我的整体方法听起来合理吗?

问题2

添加声明通常在用户登录时发生是否正确?为什么这个官方文档https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims没有提及添加声明?如果您不添加声明,这有什么用?

问题3

用户登录时添加声明的正确方法是什么?我做了一些挖掘,并且在我自己派生的UserClaimsPrincipalFactory中覆盖了GenerateClaimsAsync。它似乎有效。但我遇到的问题是:

protected override async Task<ClaimsIdentity> GenerateClaimsAsync(TUser user)

我在用户对象中传递,但我需要导航到相关数据。用户具有组织的集合导航属性,但由于我认为EF加载的方式,它尚未填充。我不知道如何指定热切或明确的加载,因为我没有上下文,看来这已经为我做了。 (我不知道是什么将用户对象传递给了这个方法。也许有一种完全不同的方式来填充声明,这是最好的。这个方法的文档似乎很少,所以也许这不是要走的路。

1 个答案:

答案 0 :(得分:0)

您可能已经在某种程度上想到了这一点,但是我的想法是:您可以将dbcontext作为构造函数参数(依赖注入)用于您自己的UserClaimsPrincipalFactory,然后根据您获得的用户查询所需的组织。