本文介绍了IProfileService-令牌中的声明的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我当前正在实施Identity Server解决方案,我需要一些有关IProfileService及其工作原理的帮助。
它公开一个名为";GetProfileDataAsync";的方法。我知道这是在IS4返回令牌时调用的。这意味着此人进入登录屏幕,输入其详细信息,然后在IS4返回身份令牌和访问令牌之前,将调用此方法以添加其他声明。
我目前正在尝试找出实现基于角色和权限的授权的最佳方法。目前,我需要访问用户分配的权限和角色,因为这就是我们的现有代码所做的,我们只是将身份验证模型切换到IS4,但保持用户管理的当前状态。
问题...
- 我如何最好地实施它?我目前有一个实现IIdentity的ApplicationUser类。那么,我应该在其中添加一个角色列表,然后添加一个权限列表,然后在用户登录时从数据库获取它时填充它吗?
ApplicationUser user = await _userRepo.FindByUsername(model.Username);
替代方法是将每个角色和每个权限作为声明添加到My UserProfileService中,特别是在下面的方法中public virtual async Task GetProfileDataAsync(ProfileDataRequestContext context)
我阅读了以下内容
推荐答案
这里有两种东西,Roles
和Permissions
。Roles
是数据,您可以将它们添加到令牌中并传递给客户端和API。您可以将Roles
以任何适合您的设计的方式保存在数据库中。要将角色放在令牌中,您需要在ProfileService
中获取它们并添加到令牌中。像这样的东西:public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
context.IssuedClaims.AddRange(context.Subject.Claims);
var user = await _userManager.GetUserAsync(context.Subject);
var roles = await _userManager.GetRolesAsync(user);
foreach (var role in roles)
{
context.IssuedClaims.Add(new Claim(JwtClaimTypes.Role, role));
}
}
完成此操作后,您的令牌应该包含角色。确保验证https://jwt.ms/上的令牌但Permissions
更多是实时计算的东西。我们需要根据用户信息、用户角色或任何其他可用的数据来决定对API的权限。例如,用户可能具有delete
角色(表示用户可以删除内容)。如果该用户调用Order API并试图删除其他人的订单,则必须拒绝该订单。表示删除权限必须按照用户ID+用户角色+订单所有者ID计算。
ProfileService
中使用缓存。但如果您使用缓存,您将负责在您的代码中进行管理。 这篇关于IProfileService-令牌中的声明的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!