如何使用 IdentityServer4 从本地数据库验证本地用户?
How to use IdentityServer4 to authenticate local user from local database?
我正在为多个现有项目创建 SSO 解决方案。大多数应用程序已经使用相同的数据库,所以相同的用户和我在 IdentityServer 中使用这些用户。但是有一个应用程序有自己的用户数据库和登录屏幕。来自此 table 的用户用于此应用程序中的 table 之一。
我的想法是让现有用户数据库保持原样。添加一列 MasterUserGuid
到 Users
table 将包含 "master" 用户 Guid(因此 IdentityServer 用于身份验证的用户)并实现以下流程:
- 用户打开应用但未登录
- 用户被重定向到 IdentityServer 并使用全局凭据
- 用户被重定向回应用程序,该应用程序从声明中获取全局用户 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>();
我正在为多个现有项目创建 SSO 解决方案。大多数应用程序已经使用相同的数据库,所以相同的用户和我在 IdentityServer 中使用这些用户。但是有一个应用程序有自己的用户数据库和登录屏幕。来自此 table 的用户用于此应用程序中的 table 之一。
我的想法是让现有用户数据库保持原样。添加一列 MasterUserGuid
到 Users
table 将包含 "master" 用户 Guid(因此 IdentityServer 用于身份验证的用户)并实现以下流程:
- 用户打开应用但未登录
- 用户被重定向到 IdentityServer 并使用全局凭据
- 用户被重定向回应用程序,该应用程序从声明中获取全局用户 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>();