如何将本地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();
});