IProfileService-令牌中的声明 [英] IProfileService - Claims in tokens
本文介绍了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)
我阅读了以下内容
在创建令牌或处理对用户信息或自检终结点的请求时,常常需要有关用户的身份信息。默认情况下,身份服务器只有身份验证Cookie中的声明可用于此身份数据。将用户需要的所有可能的声明都放到Cookie中是不切实际的,因此IdentityServer定义了一个扩展点,以允许根据用户的需要动态加载声明。此扩展点是IProfileService,开发人员实现此接口以访问包含用户身份数据的自定义数据库或API是很常见的。
推荐答案
这里有两种东西,我如何最好地实施它?我目前有一个实现IIdentity的ApplicationUser类。那么,我应该在其中添加一个角色列表,然后添加一个权限列表,然后在用户登录时从数据库获取它时填充它吗?
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计算。
在上述情况下,因为我已经实现了IProfileService,这是否意味着加载的所有声明都将自动返回并放入身份/访问令牌中?这是否意味着,对于向API发出的每个请求,我的应用程序将发送一个令牌(在Cookie中),该令牌可能会因包括角色和权限的这些声明而变得非常大?IS4网站上的上述声明提到这是不切实际的,那么还有什么替代方案是的,只要IDS4需要将有关用户的声明返回给客户端应用程序,就会调用配置文件服务。如果您请求身份令牌和访问令牌-它将被调用两次(因为您可能会将不同的声明放入每种令牌类型)。
您应该只获取所需的数据,而不是额外的数据。正如我上面提到的,权限应该是动态计算的,而不是在令牌中。 您也可以在IS4网站上的上述声明提到这是不切实际的,有什么替代方案
ProfileService
中使用缓存。但如果您使用缓存,您将负责在您的代码中进行管理。
这篇关于IProfileService-令牌中的声明的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文