如何在使用应用程序时将本地信息填充到User.Identity中.使用IdentityServerBearerToken



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

我正在处理一个ASP.NET客户端应用程序,该应用程序使用IdentityServer3应用程序作为其身份验证提供程序。我正在Authorization标头中发送一个承载令牌,它似乎运行良好。在我的客户端应用程序中,我使用以下中间件:

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

当前User.Identity包含来自OpenId Connect提供程序的信息。太棒了但我也希望包括有关本地用户的信息。我在AspNetUsers和AspNetUserLogins中有数据来表示本地用户(AspNetUserLogins.ProviderKey等于OpenId Connect上用户的订阅者id)。

如何将本地AspNetUsers的数据填充到User.Identity对象中,以便在ApiControllers中使用它?我可以很好地获取数据,只需要将数据输入User.Identity就可以了。

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

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();
});

相关内容

  • 没有找到相关文章

最新更新