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

Asp.net core 如何使用IdentityServer4从本地数据库对本地用户进行身份验证?,asp.net-core,entity-framework-core,asp.net-identity,identityserver4,Asp.net Core,Entity Framework Core,Asp.net Identity,Identityserver4,我正在为多个现有项目创建SSO解决方案。大多数应用程序已经使用了相同的数据库,所以相同的用户和我在IdentityServer中使用这些用户。但有一个应用程序有自己的用户数据库和登录屏幕。此表中的用户在此应用程序(FK)中的一个表中使用 我的想法是让现有用户数据库保持原样。将一列MasterUserGuid添加到Users表中,该表将包含“master”用户Guid(以便IdentityServer用于身份验证的用户),并实现以下流程: 用户打开应用程序,但未登录 用户被重定向到Identity

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

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

  • 用户打开应用程序,但未登录
  • 用户被重定向到IdentityServer并使用全局凭据
  • 用户被重定向回应用程序,该应用程序从声明中获取全局用户GUID并验证本地用户(在
    MasterUserGuid
    列中使用此GUID),而不是使用全局用户
  • 问题是我不知道如何实现步骤
    3
    ,或者在IdentityServer4中是否可能/支持该步骤。目前,我被重定向到IdentityServer,经过身份验证并重定向回,但随后应用程序尝试使用此外部用户

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


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

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

    public类MyClaimsTransformer:iclaims转换
    {
    公共任务TransformAsync(ClaimsPrincipal主体)
    {
    var索赔=新列表();
    索赔。添加(新索赔(…);//在这里输入索赔类型和价值
    var标识=新的索赔实体(索赔);
    本金。额外性(身份);
    返还本金;
    }
    }
    
    然后在IOC中的
    启动中注册索赔转换器。ConfigureServices
    方法:

    services.AddTransient();
    
    首先,你的应用程序是什么?是ASP.NET classic(owin)还是ASP.NET Core,它是否使用MS Identity FW访问数据库?它是使用EntityFramework的ASP.NET Core MVC。目前,它使用
    Microsoft.AspNet.Identity
    对此本地数据库进行身份验证。据我所见(我还没有编写此应用程序),AspNet.Identity使用相同的上下文(
    app.CreatePerOwinContext((选项,上下文)=>ApplicationUserManager.Create(context.Get())
    其中
    模型实体
    是EF上下文类。标识使用数据库中的标准表集(
    AspNetRoles
    AspNetUsers
    等)在上下文中未映射为
    IDbSet
    s。我现在认为解决方案可能是让用户通过全局用户身份验证,但查找并覆盖使用UserID的位置,使用映射列和本地用户ID而不是全局用户ID。我现在将检查这在代码中是否有意义。首先,我将去掉AspNet.ID实体。然后在
    AddAuthentication.AddOpenIdConnect
    中调整本地令牌,以保留您喜欢的任何内容作为主要身份(在应用程序内)