Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core IdentityServer4+;Asp.Net核心标识-将标识映射到应用程序数据库用户_Asp.net Core_Identityserver4_Asp.net Core Identity_Asp.net Authorization - Fatal编程技术网

Asp.net core IdentityServer4+;Asp.Net核心标识-将标识映射到应用程序数据库用户

Asp.net core IdentityServer4+;Asp.Net核心标识-将标识映射到应用程序数据库用户,asp.net-core,identityserver4,asp.net-core-identity,asp.net-authorization,Asp.net Core,Identityserver4,Asp.net Core Identity,Asp.net Authorization,我正在尝试使用Asp.Net核心标识实现IdentityServer4。 我希望使用IdentityServer4作为始终使用相同标识的API的集中身份验证/授权点。 因此,我们的想法是将Asp.Net核心标识存储在一个SQL数据库中,作为标识存储 现在的问题是如何将集中式标识映射到特定于应用程序的数据。 我想在几个应用程序中使用相同的身份用户,但在每个应用程序中,用户都有其他相关的实体、角色等 我通读了IdentityServer4的文档,但找不到任何与提议的结构相关的内容 据我所知,您以某种

我正在尝试使用Asp.Net核心标识实现IdentityServer4。 我希望使用IdentityServer4作为始终使用相同标识的API的集中身份验证/授权点。 因此,我们的想法是将Asp.Net核心标识存储在一个SQL数据库中,作为标识存储

现在的问题是如何将集中式标识映射到特定于应用程序的数据。 我想在几个应用程序中使用相同的身份用户,但在每个应用程序中,用户都有其他相关的实体、角色等

我通读了IdentityServer4的文档,但找不到任何与提议的结构相关的内容

据我所知,您以某种方式将标识id映射到本地应用程序用户。 firstname等基本数据存储在集中式标识存储中,特定于应用程序的数据存储在特定于应用程序的数据库中。因此,您不会将firstname等保存在特定于应用程序的数据库中,对吗? 在需要用户特定数据的每个请求中,都会查询identity server以获取信息/索赔? 注册过程如何

是否有人有清晰的结构设置,可以用来理解整个设置?
(如Asp.Net标识提供程序、IdentityServer 4、受保护的Api等)要自定义Asp.Net核心标识中存储的内容,需要使用
服务。附加属性
ApplicationUser
ApplicationRole
正在扩展
IdentityUser
IdentityRole
。这样你就可以让它存储你想要的任何额外信息

然后要返回额外信息,需要创建一个实现
IProfileService
ProfileService
。使用此服务,您可以添加任何额外信息来声明令牌

您需要将此服务注册为

services.AddSingleton<IProfileService, ProfileService>();
builder.AddAspNetIdentity<ApplicationUser>().AddProfileService<ProfileService>();

使用OpenId,您拥有与用户关联的默认声明集。因此,任何客户端应用程序都可以访问这些声明。确保每个客户端都有分配给它们的openidprofile作用域。否则客户端应用程序将无法访问用户的基本详细信息

在Asp.Net核心应用程序中,您可以使用用户属性访问控制器中的这些声明

因此,您不会将firstname等保存在特定于应用程序的数据库中 对吧?

是的,特定于用户的属性应进入用户配置文件,并应保存在IdentityServer的用户存储(数据库)中。应用程序特定的用户数据应存储在应用程序存储中

在中,需要特定于用户的数据的每个请求都将查询 identity server是否可以获取信息/索赔

不一定,用户特定数据可以作为声明包含在标识令牌中。然后,这些声明将作为身份验证票证存储在cookie中。对于每个请求,这些声明(存储在cookie/s中)通过控制器的用户属性可用

var identity = (ClaimsIdentity)User.Identity;
IEnumerable<Claim> claims = identity.Claims;
var-identity=(ClaimsIdentity)User.identity;
IEnumerable claims=identity.claims;
您可以根据用户Id存储和查询与应用程序相关的用户数据(
sub
claim可以用作用户Id)

如果您在应用程序中需要大量特定于用户的数据,那么在identity token中包含所有数据并不是最佳选择,而且您不太可能在每个请求中都需要这些数据。所以,当您需要额外信息时,可以查询identity server的UserInfo端点。只需在您的身份令牌中包含标识用户所需的基本信息

注册过程如何


注册是一个完全独立的工作流,不涉及identity server。您只需要将用户保存到标识存储(可能使用asp.net标识)。当然,您可以将注册控制器与identity server一起托管,以便与身份相关的内容物理上位于同一台服务器上。您也可以从注册过程所在的任何地方(例如,单独的管理UI,或涉及电子邮件验证、手动批准等的工作流)向IdentityServer用户商店写信。

您认为混合应用程序特定数据和身份数据是一个好主意吗?这完全取决于它的复杂性。就我个人而言,我只是添加了一个带有外键的列。有了外键,我可以根据需要查询所有其他表。例如,您可以将名为MemberId的列添加到ApplicationUser,这可以引用您的Members表。从那里,您可以创建应用程序所需的所有复杂表格结构。感谢您的解释!
var identity = (ClaimsIdentity)User.Identity;
IEnumerable<Claim> claims = identity.Claims;