我正在为多个现有项目创建SSO解决方案。大多数应用程序已经使用相同的数据库,因此,相同的用户以及我在IdentityServer中使用这些用户。但是,有一个应用程序具有自己的用户数据库和登录屏幕。此表中的用户用于该应用程序(FK)中的表之一。
我的想法是保留现有用户数据库不变。向MasterUserGuid
表中添加一列Users
,其中将包含“主”用户Guid(因此IdentityServer用于身份验证的用户),并实现以下流程:
MasterUserGuid
列中具有此GUID),而不是使用全局用户问题是我不知道如何实现步骤3
或IdentityServer4中是否甚至可能支持它。目前,我已重定向到IdentityServer,经过身份验证并重定向回去,但是应用程序尝试使用此外部用户。
在进行研究时,我已经读到用户应该在一个表中,所以也许这种方法是完全错误的,最好删除本地用户并破坏所提到的表的FK并进行一些用户手动迁移。
我提供的步骤中描述的场景是否可能且理智?
答案 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>();