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

时间:2019-09-24 09:46:47

标签: asp.net-core entity-framework-core asp.net-identity identityserver4

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

我的想法是保留现有用户数据库不变。向MasterUserGuid表中添加一列Users,其中将包含“主”用户Guid(因此IdentityServer用于身份验证的用户),并实现以下流程:

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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