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

Asp.net identity 使用app.UseIdentityServerBearerTokenAuthentication()时如何将本地信息填充到User.Identity中,asp.net-identity,openid-connect,identityserver3,Asp.net Identity,Openid Connect,Identityserver3,如何将本地AspNetUsers中的数据填充到User.Identity对象中,以便在APIController中使用 我正在开发一个ASP.NET客户端应用程序,该应用程序使用IdentityServer3应用程序作为身份验证提供程序。我正在授权头中发送一个不记名令牌,它似乎工作得很好。在我的客户端应用程序中,我使用以下中间件: app.UseIdentityServerBearerTokenAuthentication( new IdentityServerBeare

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

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

    app.UseIdentityServerBearerTokenAuthentication(
        new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = settingsService.SsoProviderUrl + "/core/"
        }
    );
当前User.Identity包含来自OpenId连接提供程序的信息。伟大的但我也希望包括有关本地用户的信息。我在AspNetUsers和AspNetUserLogins中有数据来表示本地用户(AspNetUserLogins.ProviderKey等于OpenId Connect上用户的订户id)


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

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

app.Use(异步(上下文,下一步)=>
{
if(context.Authentication.User.Identity.IsAuthenticated)
{
var identity=context.Authentication.User.identies.First();
//访问权声明
var idClaim=identity.FindFirst(ClaimTypes.NameIdentifier);
字符串subscriberId=idClaim.Value;
//从数据库中获取用户信息的自定义代码
var dbUser=await userService.FindAsync(新用户登录信息(“MyProviderName”,subscriberId));
//将自定义用户信息放入当前标识的声明中。
identity.AddClaim(新声明(“名称”,dbUser.UserName));
identity.AddClaim(新声明(“最喜欢的颜色”,dbUser.FavoriteColor));
//等等
}
等待next.Invoke();
});

与其尝试合并本地标识和外部标识,不如让identity Server使用访问令牌发送所有必要的声明?客户机具有本地标识有什么原因吗?另一个想法是,您始终可以在Web API的管道中进行声明转换。