本文介绍了IProfileService-令牌中的声明的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我当前正在实施Identity Server解决方案,我需要一些有关IProfileService及其工作原理的帮助。

它公开一个名为";GetProfileDataAsync";的方法。我知道这是在IS4返回令牌时调用的。这意味着此人进入登录屏幕,输入其详细信息,然后在IS4返回身份令牌和访问令牌之前,将调用此方法以添加其他声明。

我目前正在尝试找出实现基于角色和权限的授权的最佳方法。目前,我需要访问用户分配的权限和角色,因为这就是我们的现有代码所做的,我们只是将身份验证模型切换到IS4,但保持用户管理的当前状态。

问题...

  1. 我如何最好地实施它?我目前有一个实现IIdentity的ApplicationUser类。那么,我应该在其中添加一个角色列表,然后添加一个权限列表,然后在用户登录时从数据库获取它时填充它吗?
例如,在此方法中ApplicationUser user = await _userRepo.FindByUsername(model.Username);

替代方法是将每个角色和每个权限作为声明添加到My UserProfileService中,特别是在下面的方法中
public virtual async Task GetProfileDataAsync(ProfileDataRequestContext context)

  1. 我阅读了以下内容

在上述情况下,因为我已经实现了IProfileService,这是否意味着加载的所有声明都将自动返回并放入身份/访问令牌中?这是否意味着,对于向API发出的每个请求,我的应用程序将发送一个令牌(在Cookie中),该令牌可能会因包括角色和权限的这些声明而变得非常大?IS4网站上的上述声明提到这是不切实际的,那么还有什么替代方案

推荐答案

这里有两种东西,RolesPermissionsRoles是数据,您可以将它们添加到令牌中并传递给客户端和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计算。

是的,只要IDS4需要将有关用户的声明返回给客户端应用程序,就会调用配置文件服务。如果您请求身份令牌和访问令牌-它将被调用两次(因为您可能会将不同的声明放入每种令牌类型)。

您应该只获取所需的数据,而不是额外的数据。正如我上面提到的,权限应该是动态计算的,而不是在令牌中。您也可以在ProfileService中使用缓存。但如果您使用缓存,您将负责在您的代码中进行管理。

这篇关于IProfileService-令牌中的声明的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-30 10:18