如何在客户端获得用户角色?

时间:2020-05-10 11:34:42

标签: angular asp.net-core openid-connect

我正在使用ASP.NET Core后端开发Angular Web应用程序。首先从用于“个人用户帐户”身份验证的内置“带有Angular的ASP.NET Core应用程序”模板项目开始。我的问题是要在客户端获得经过身份验证的用户角色(我想在角色中处理警卫和菜单)。

现在,我拥有API端点,该端点可以从后端返回用户的角色。

当我需要了解用户角色时调用此端点。例如。菜单处理 导航菜单组件

但是我知道这不是最好的解决方案。可能的代码重复等。

还有其他解决方案吗?

我尝试了另一种解决方案,但效果不好。 在授权服务中,在登录期间建立用户个人资料(任意)时,我应该将角色附加到个人资料中。 enter image description here

感谢您的任何建议

3 个答案:

答案 0 :(得分:0)

如果您发布代码段而不是图像,将会更有帮助。

但是,据我在您的代码中看到的,您正在订阅另一个订阅,这是一个不好的做法。

这是您应该执行的操作:

this.authorizeService
      .getUser()
      .pipe(
        // switchMap completes the previous observable and subscribe to the next one
        // the argument (user) is the data you get from the previous observable
        switchMap(user => (user ? this.authorizeService.getUserRoles(user.name) : of(null))))
      .subscribe(roles => this.roles = roles);

答案 1 :(得分:0)

如果您有权进行后端代码,最好将2个端点合并为一个,... 例如。您可以像这样在用户名端点中组合角色端点,并在json中将其给出响应

{
  username:'femix',
  role:'admin'
}

这将为您节省1个请求,而不仅仅是使用2个请求来获取用户名和角色。

答案 2 :(得分:0)

将近一年后,我想用答案更新我的问题。

我需要创建一个实现 ProfileService 接口的 IProfileService

public class ProfileService : IProfileService
{
    protected UserManager<ApplicationUser> UserManager;
    public ProfileService(UserManager<ApplicationUser> userManager)
    {
        UserManager = userManager;
    }

    public async Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        ApplicationUser user = await UserManager.GetUserAsync(context.Subject);

        IList<string> roles = await UserManager.GetRolesAsync(user);

        var claims = new List<Claim> {
            // here you can include other properties such as id, email, address, etc. as part of the jwt claim types
            new Claim(JwtClaimTypes.Email, user.Email),
            new Claim(JwtClaimTypes.Name, $"{user.Firstname} {user.Lastname}")
        };
        foreach (string role in roles)
        {
            // include the roles
            claims.Add(new Claim(JwtClaimTypes.Role, role));
        }

        context.IssuedClaims.AddRange(claims);
    }

    public Task IsActiveAsync(IsActiveContext context)
    {
        return Task.CompletedTask;
    }
}

为 Startup 添加了 DI 注册

services.AddTransient<IProfileService, ProfileService>();