我正在为多个现有项目创建SSO解决方案。大多数应用程序已经使用相同的数据库,因此我和相同的用户在IdentityServer中使用这些用户。但是有一个应用程序有自己的用户数据库和登录屏幕。此表中的用户用于此应用 (FK( 中的一个表。
我的想法是让现有用户数据库保持原样。将列MasterUserGuid
添加到Users
表中,该表将包含"主"用户 Guid(即 IdentityServer 用于身份验证的用户(,并实现以程:
- 用户打开应用但未登录
- 用户被重定向到身份服务器并使用全局凭据 用户
- 被重定向回从声明中获取全局用户 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>();