我正在使用IdentityServer4作为OIDC提供程序和ASP.NET Core 2.0。
我已经浏览了几篇文章,以确保IdentityServer发出的声明最终出现在ClaimsPrincipal中(即Auth Cookie),并设法通过ClaimsAction过滤来实现这一点。
但是,我的问题是...当使用ASP.NET Identity(和EF后备存储)运行IdentityServer时,ASP.NET Identity属性如何映射到IDS4返回的声明。默认情况下,IDS4返回诸如...的声明。
我问这个的原因是我想作图
因为在请求PROFILE范围时,默认情况下IDS4似乎不执行此操作。
另外,我想问一下存储用户属性的最佳实践。使用ASP.NET Identity DB时,将创建两个表...
因此,最佳实践是将其他用户属性添加为...
正如您自己回答的那样,应该以编程方式映射扩展属性。
- 如果要向
AspNetUsers
表中添加列,请扩展IdentityUser
类(例如public class MyApplicationUser : IdentityUser
),然后添加自定义属性(例如FirstName
)。这实质上改变了模型。为确保 EF 将您的模型更改写入 DB 表,您需要IdentityDbContext
使用新MyApplicationUser
类扩展该类。- 如果您希望将用户的自定义声明(例如
hair_color
)添加到AspNetUserClaims
表中,您需要调用userManager.AddClaimAsync()
. 您可以在注册过程或登录过程中使用表单中的数据或从外部身份验证提供商(如 Google、Facebook、Twitter 等)收到的数据执行此操作。
但是,正如您在我对您的其他问题的回答中所读到的那样,我认为您不应该映射它们,而应立即声明它们。
我发现您的其他问题更有趣:要添加哪些属性AspNetUsers
以及何时添加AspNetUserClaims
?
经过一些讨论,我可能会说,主要考虑因素是:
AspNetUsers
)并在创建主体时传播到声明(必要时)。AspNetUsersClaims
) 中的声明。例子:
hair_color
是用户在此身份接口中输入和更改的属性,则将其存储在强类型数据库列中。hair_color
是在另一个应用程序中维护并从那里更新的属性,我会将其存储为声明表中的记录。在我编写原始答案(如下)的情况下,要共享的用户数据是从另一个(主要)来源间接更新的,但对于身份验证详细信息,ASP.NET Identity 是主要来源。所以它导致了相同的分布,但出于不同的原因。
据我了解,经验法则是:
AspNetUsersClaims
.AspNetUsers
) 的一部分,因此数据用于:标识、登录、恢复、2-fact 等(例如用户名、密码、电子邮件、电话)例子:
DateOfBirth
我会把它添加到AspNetUsersClaims
(除非你打算以某种方式使用它进行身份验证/登录)accountExpiresDate
或者CreatedFromIP
您将其添加到AspNetUsers
(并扩展IdentityUser
)因此,如果您使用 aUserClaimsPrincipalFactory
将用户属性添加到您的用户声明中,您可能只是将该属性添加到错误的表中!
我实际上再次发现了您的问题,同时我自己也对此感到疑惑。我开始使用上面的经验法则,但问题不断出现,因为很多例子都没有遵循这个规则。例如,Microsoft 有一个建议添加Name 和 DOB的示例,这似乎与此矛盾。然而,OpenID的已经定义了这些性能(AO)为标准的权利要求中任选的profile
范围:birthdate, name, family_name, given_name, middle_name, nickname, preferred_username
。
归档时间: |
|
查看次数: |
357 次 |
最近记录: |