使用 app.UseIdentityServerBearerTokenAuthentication() 时如何将本地信息填充到 User.Identity

How to populate local info into User.Identity when using app.UseIdentityServerBearerTokenAuthentication()

如何将我本地 AspNetUsers 的数据填充到 User.Identity object,以便它可以在 ApiControllers 中使用?

我正在开发一个 ASP.NET 客户端应用程序,它使用 IdentityServer3 应用程序作为身份验证提供程序。我正在授权 header 中发送不记名令牌,这似乎运行良好。在我的客户端应用程序中,我使用了以下中间件:

    app.UseIdentityServerBearerTokenAuthentication(
        new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = settingsService.SsoProviderUrl + "/core/"
        }
    );

目前 User.Identity 包含来自 OpenId Connect 提供商的信息。伟大的!但我还想包括有关本地用户的信息。我在 AspNetUsers 和 AspNetUserLogins 中有数据来代表本地用户(AspNetUserLogins.ProviderKey 等于用户在 OpenId Connect 上的订阅者 ID)。

如何将本地 AspNetUsers 中的数据填充到 User.Identity object,以便它可以在 ApiControllers 中使用?我可以很好地掌握数据,这只是将数据输入 User.Identity 的问题,这让我很困惑。

我找到的解决方案是创建我自己的中间件,它在 UseIdentityServerBearerTokenAuthentiation() 之后插入管道。新的中间件只是检索我想要添加的数据,并将声明添加到当前身份。示例代码:

app.Use(async (context, next) =>
{
    if (context.Authentication.User.Identity.IsAuthenticated)
    {
        var identity = context.Authentication.User.Identities.First();
        // Access claims
        var idClaim = identity.FindFirst(ClaimTypes.NameIdentifier);
        string subscriberId = idClaim.Value;

        // your custom code to obtain user information from your database
        var dbUser = await userService.FindAsync(new UserLoginInfo("MyProviderName", subscriberId));

        // put your custom user information into the claims for the current identity.
        identity.AddClaim(new Claim("name", dbUser.UserName));
        identity.AddClaim(new Claim("favorite-color", dbUser.FavoriteColor));
        // and so on

    }

    await next.Invoke();
});