我正在使用IdentityServer4作为OIDC提供程序和ASP.NET Core 2.0。
我已经浏览了几篇文章,以确保IdentityServer发出的声明最终出现在ClaimsPrincipal(即Auth Cookie)中,并设法通过ClaimsAction过滤来实现此目的。
但是我的问题是... 使用ASP.NET标识(和EF后备存储)运行IdentityServer时,如何将ASP.NET标识属性映射到IDS4返回的声明。默认情况下,IDS4返回诸如...的声明。
我问这个的原因是我想映射
因为在请求PROFILE范围时,默认情况下IDS4似乎没有执行此操作。
此外,我想问一下存储用户属性的最佳实践。使用ASP.NET Identity DB时,将创建两个表...
因此,最好的做法是将其他用户属性添加为...
答案 0 :(得分:0)
当您回答yourself时,应该以编程方式映射扩展属性。
- 如果要将列添加到AspNetUsers表,请扩展IdentityUser类。 (例如,公共类MyApplicationUser:IdentityUser),然后添加您的自定义属性(例如,FirstName)。这实质上改变了模型。为了确保EF将模型更改写入数据库表,您需要使用新的MyApplicationUser类扩展IdentityDbContext类。
- 如果要将用户的自定义声明(例如hair_color)添加到AspNetUserClaims表中,则需要调用userManager.AddClaimAsync()。您可以在注册过程或登录过程中使用表单中的数据,或从外部身份验证提供商(例如Google,Facebook,Twitter等)收到的声明中进行此操作。
但是,正如您在我对其他问题的回答中所读到的那样,我认为您不应映射它们,而应立即对其进行声明。
我发现您的另一个问题更有趣:向AspNetUsers
添加什么属性以及何时向AspNetUserClaims
添加什么属性?
据我了解,经验法则是:
AspNetUsersClaims
中声明。AspNetUsers
)的一部分,因此用于以下各项的数据:标识,登录,还原,2事实等(例如用户名,密码) ,电子邮件,电话)示例:
AspNetUsersClaims
(除非您打算以某种方式使用它进行身份验证/登录)accountExpiresDate
或CreatedFromIP
,请将其添加到AspNetUsers
(并扩展IdentityUser
)因此,如果您使用UserClaimsPrincipalFactory
向用户声明中添加用户属性,则可能只是将该属性添加到错误的表中!
当我自己对此感到疑惑时,我实际上找到了你的问题。我开始使用上面的经验法则,但是这个问题不断出现,因为很多示例都没有遵循此法则。
例如。 Microsoft有一个示例建议添加Name and DOB,这似乎与此矛盾。
但是, OpenID 已在可选的standard claims:birthdate, name, family_name, given_name, middle_name, nickname, preferred_username
中将这些属性(默认)定义为profile
scope。