如何使用 IdentityServer4 从本地数据库验证本地用户?

How to use IdentityServer4 to authenticate local user from local database?

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

我的想法是让现有用户数据库保持原样。添加一列 MasterUserGuidUsers table 将包含 "master" 用户 Guid(因此 IdentityServer 用于身份验证的用户)并实现以下流程:

  1. 用户打开应用但未登录
  2. 用户被重定向到 IdentityServer 并使用全局凭据
  3. 用户被重定向回应用程序,该应用程序从声明中获取全局用户 GUID 并验证本地用户(在 MasterUserGuid 列中使用此 GUID),而不是使用全局用户

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

在研究过程中我读到用户应该在一个 table 中,所以这种方法可能是完全错误的,最好删除本地用户并打破提到的 table 和 FK对用户进行一些手动迁移。

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

您需要调整您的应用程序以首先通过 IdentityServer 进行身份验证。删除所有与注册、登录等相关的 ASP.NET Core Identity 逻辑,假设所有这些都将在 IdentityServer 端完成。然后实施 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中注册你的claims transformer:

services.AddTransient<IClaimsTransformation, MyClaimsTransformer>();