使用外部声明填充访问令牌的最佳做法

问题描述 投票:0回答:1

我们已经在AspNetCore Identity之上实现了IdSrv4,我们将ADFS用作外部IdP。我们希望通过ADFS获得用户广告组,其他用户的版权主张。声明将在我们的IdSrv4实现中使用,但也将作为访问令牌的一部分发送到我们的API资源。

我们的IdSrv4实现的当前情况:

  • ADFS已配置为发出我们想要的声明,并且在我们的IdSrv4实现中,这些声明已按预期方式在AccountController的“ ExternalLoginCallback”方法中收到。
  • 已实施IProfileService,以便用声明填充“ IssuedClaims”列表。

但是,我尚未设法在步骤与步骤之间建立联系。保存“ ExternalLoginCallback”中收到的声明并将其放入IProfileService类的生成的access_token中的首选方法是什么?

现在,我已经设法通过使用方法“ UpdateExternalAuthenticationTokensAsync”保存令牌来将其工作,该方法会将令牌保存在数据库中。然后,在个人档案服务中,我获取令牌并将声明读入发出的令牌。

但是感觉不对,在寻找正确的方法时,我已经看到示例使用具有“ AdditionalClaims”属性的类IdentityServerUser,但是我找不到将这种类型插入事件流的方法。另外,在配置外部IdP时,您可以映射这些“ ClaimAction”,但我不知道它们是什么。最后,我假设将具有相应实体应该的数据库表“ IdentityClaims”和“ ClientClaims”用于此目的,但我不知道该如何做。还是应该将它们保存在“ AspNetUserClaims”表中以保存实际的声明类型/值,而不仅是声明映射?

因此,基本上,这种情况下必须有一种最佳实践,它似乎避免了我,如果有人可以分享它,我将非常感激。

identityserver4
1个回答
0
投票

我的问题的主要问题是,我最初在将索赔保留在AspNetIdentity-Db中时遇到的问题导致了我的追逐。

大约一个星期后又回到了这个位置,这又让我给了另一个镜头。原来,注入DI的“ _userManager”未与当前注入DI的“ _signInManager”“连接”。如果有人对此有解释,请分享!

所做的工作是使用“ _signInManager.UserManager”更新用户的声明。这样就可以将索赔正确地存储在“ AspNetUserClaims”表中,然后可以在概要文件服务中对其进行检索。

更新1:当然,对此也有合乎逻辑的答案。即使您在启动过程中未在身份设置中调用“ AddUserManager”,默认情况下也会创建一个用户管理器。但是,在我的情况下,我扩展了IdentityUser类,现在通过这样做就可以按预期运行(其中“ UserIdentity”是我的派生类):

.AddIdentity<TUserIdentity, TUserIdentityRole>(options =>
            {
                options.User.RequireUniqueEmail = true;
            })
            .AddEntityFrameworkStores<TIdentityDbContext>()
            .AddSignInManager<SignInManager<UserIdentity>>()
            .AddUserManager<UserManager<UserIdentity>>()
            .AddDefaultTokenProviders();
© www.soinside.com 2019 - 2024. All rights reserved.