在 Identity Server 4 中放置用户声明的位置
Where to put user claims in Identity Server 4
我正在使用 Identity Server 4 来管理组织中所有应用程序的登录信息。
所以我部署了 IdentityServer 4 并连接到 sql 服务器数据库。
现在我有 5 个客户端应用程序,每个都有自己的 roles/claims(即应用程序 1 有经理、会计师,而应用程序 2 有开发人员、经理、电工,应用程序 3 有设计师、管理员、审阅者...)。
我的问题是:
我是将这些用户 role/claims 放在 Identityserver4 数据库中,还是每个应用程序都应该有自己的数据库来保存自己的用户 roles/claims?
谢谢
您可以通过向 IdentityServer 数据库添加一个额外的 table 来解决它,例如 RoleClientAuthorizations。在这个table.
中你需要持有RoleId,ClientId和AuthorizationLevel
然后您可以return运行时在 ProfileService 中关于该客户端的所有声明。
public class ProfileService : IProfileService
{
private readonly IUserClaimsPrincipalFactory<ApplicationUser> _claimsFactory;
private readonly UserManager<ApplicationUser> _userManager;
private readonly IClientService _clientService;
public ProfileService(UserManager<ApplicationUser> userManager, IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory,IClientService clientService)
{
_userManager = userManager;
_claimsFactory = claimsFactory;
_clientService = clientService;
}
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var sub = context.Subject.GetSubjectId();
var user = await _userManager.FindByIdAsync(sub);
var principal = await _claimsFactory.CreateAsync(user);
var clientId = context.Client.ClientId;
var claims = principal.Claims.ToList();
--You will get role client information from RoleClientAuthorization table here
var userAuthorizationLevelClaim = _clientService.GetUserAuthorizationLevel(clientId, sub);
if(userAuthorizationLevelClaim != null)
{
claims.Add(new Claim("authorizationLevelCode", userAuthorizationLevelClaim.AuthorizationLevelId.ToString()));
claims.Add(new Claim("authorizationPrivilegeType", userAuthorizationLevelClaim.PrivilegeType));
}
context.IssuedClaims = claims;
}
public async Task IsActiveAsync(IsActiveContext context)
{
var sub = context.Subject.GetSubjectId();
var user = await _userManager.FindByIdAsync(sub);
context.IsActive = user != null;
}
正在启动;
services.AddIdentity()
.AddProfileService<ProfileService>();
这听起来有点像您混淆了身份验证和授权。您的身份不应该从一个应用程序到另一个应用程序改变——你是谁,你是由什么组成的是一个常数(ish),你的身份不应该仅仅因为你现在在不同的应用程序上而改变。
是的,您的角色 可能会因应用而异,您的权限和授权决定可能会发生变化,但您的身份不会。
https://leastprivilege.com/2016/12/16/identity-vs-permissions/
使用 IdentityServer 来管理身份并发布身份证明很好,但您应该寻找一种不同的解决方案来在您的应用程序中授权用户......让这些应用程序决定是否给定提供的身份,用户可以做这件事。这可能是基于角色的,或者涉及更多的东西。这意味着您应该管理用户在每个应用程序中具有的应用程序角色,而不是身份服务器。
我正在使用 Identity Server 4 来管理组织中所有应用程序的登录信息。 所以我部署了 IdentityServer 4 并连接到 sql 服务器数据库。 现在我有 5 个客户端应用程序,每个都有自己的 roles/claims(即应用程序 1 有经理、会计师,而应用程序 2 有开发人员、经理、电工,应用程序 3 有设计师、管理员、审阅者...)。 我的问题是: 我是将这些用户 role/claims 放在 Identityserver4 数据库中,还是每个应用程序都应该有自己的数据库来保存自己的用户 roles/claims?
谢谢
您可以通过向 IdentityServer 数据库添加一个额外的 table 来解决它,例如 RoleClientAuthorizations。在这个table.
中你需要持有RoleId,ClientId和AuthorizationLevel然后您可以return运行时在 ProfileService 中关于该客户端的所有声明。
public class ProfileService : IProfileService
{
private readonly IUserClaimsPrincipalFactory<ApplicationUser> _claimsFactory;
private readonly UserManager<ApplicationUser> _userManager;
private readonly IClientService _clientService;
public ProfileService(UserManager<ApplicationUser> userManager, IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory,IClientService clientService)
{
_userManager = userManager;
_claimsFactory = claimsFactory;
_clientService = clientService;
}
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var sub = context.Subject.GetSubjectId();
var user = await _userManager.FindByIdAsync(sub);
var principal = await _claimsFactory.CreateAsync(user);
var clientId = context.Client.ClientId;
var claims = principal.Claims.ToList();
--You will get role client information from RoleClientAuthorization table here
var userAuthorizationLevelClaim = _clientService.GetUserAuthorizationLevel(clientId, sub);
if(userAuthorizationLevelClaim != null)
{
claims.Add(new Claim("authorizationLevelCode", userAuthorizationLevelClaim.AuthorizationLevelId.ToString()));
claims.Add(new Claim("authorizationPrivilegeType", userAuthorizationLevelClaim.PrivilegeType));
}
context.IssuedClaims = claims;
}
public async Task IsActiveAsync(IsActiveContext context)
{
var sub = context.Subject.GetSubjectId();
var user = await _userManager.FindByIdAsync(sub);
context.IsActive = user != null;
}
正在启动;
services.AddIdentity()
.AddProfileService<ProfileService>();
这听起来有点像您混淆了身份验证和授权。您的身份不应该从一个应用程序到另一个应用程序改变——你是谁,你是由什么组成的是一个常数(ish),你的身份不应该仅仅因为你现在在不同的应用程序上而改变。 是的,您的角色 可能会因应用而异,您的权限和授权决定可能会发生变化,但您的身份不会。 https://leastprivilege.com/2016/12/16/identity-vs-permissions/
使用 IdentityServer 来管理身份并发布身份证明很好,但您应该寻找一种不同的解决方案来在您的应用程序中授权用户......让这些应用程序决定是否给定提供的身份,用户可以做这件事。这可能是基于角色的,或者涉及更多的东西。这意味着您应该管理用户在每个应用程序中具有的应用程序角色,而不是身份服务器。