如何使用 IdentityServer4 从本地数据库对本地用户进行身份验证?



我正在为多个现有项目创建SSO解决方案。大多数应用程序已经使用相同的数据库,因此我和相同的用户在IdentityServer中使用这些用户。但是有一个应用程序有自己的用户数据库和登录屏幕。此表中的用户用于此应用 (FK( 中的一个表。

我的想法是让现有用户数据库保持原样。将列MasterUserGuid添加到Users表中,该表将包含"主"用户 Guid(即 IdentityServer 用于身份验证的用户(,并实现以程:

  1. 用户打开应用但未登录
  2. 用户被重定向到身份服务器并使用全局凭据
  3. 用户
  4. 被重定向回从声明中获取全局用户 GUID 并对本地用户进行身份验证的应用(在MasterUserGuid列中使用此 GUID(,而不是使用全局用户

问题是我不知道如何实现步骤3,或者它是否在 IdentityServer4 中可能/受支持。目前,我被重定向到IdentityServer,经过身份验证并重定向回来,但随后应用程序尝试使用此外部用户。

在研究时,我读到用户应该在一个表中,所以也许这种方法是完全错误的,最好删除本地用户并打破上述表的 FK 并手动迁移用户。

我提供的步骤中描述的方案是否可行且合理?

您需要先调整应用程序以通过身份服务器进行身份验证。删除与注册、登录等相关的所有 ASP.NET 核心身份逻辑,假设所有这些都将在身份服务器端完成。然后实现IClaimsTransformation实例,该实例将替换当前ClaimsPrincipal,或者根据需要使用所需的声明值(从本地数据库填充(向其添加其他标识。下面是示例:

public class MyClaimsTransformer : IClaimsTransformation
{
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
var claims = new List<Claim>();
claims.Add(new Claim(...)); // put here your claim type and value
var identity = new ClaimsIdentity(claims);
principal.AddIdentity(identity);
return principal;
}
}

然后Startup.ConfigureServices方法在 IOC 中注册声明转换器:

services.AddTransient<IClaimsTransformation, MyClaimsTransformer>();

相关内容

  • 没有找到相关文章

最新更新