使用IdentityServer4和.NET Core实现基于角色的访问控制

时间:2019-02-12 01:38:41

标签: asp.net-core identityserver4

我们有一个现有的数据库,需要使用IdentityServer4和.NET Core实现基于角色的访问控制。

我的问题是:

1 IdenityServer4是否支持RBAC?例如是通过范围声明吗?应该如何实施?

2我可以使用现有数据库吗?还是我必须创建一个新的数据库?

任何建议或代码示例都将不胜感激。

https://github.com/IdentityServer/IdentityServer4.Samples/tree/master/Quickstarts/7_EntityFrameworkStorage

更新

我们实现了资源所有者密码授予类型和RBAC。

任何建议或指向代码示例的链接都将不胜感激。

1 个答案:

答案 0 :(得分:0)

在Identity Server方面,您可以创建Profile Service,以使IDS4在颁发令牌时包含role声明。

例如,如果使用ASP.NET Identity管理用户/角色,则可以创建配置文件服务,例如:

public class MyProfileService : IProfileService
{
    public MyProfileService()
    { }

    public Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        var roleClaims = context.Subject.FindAll(JwtClaimTypes.Role);
        List<string> list = context.RequestedClaimTypes.ToList();
        context.IssuedClaims.AddRange(roleClaims);
        return Task.CompletedTask;
    }

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

并在Startup.cs中注册:

services.AddTransient<IProfileService, MyProfileService>();

在客户端,您应该从JWT令牌映射角色声明,并尝试在AddOpenIdConnect中间件中的config下面进行操作:

  options.ClaimActions.MapJsonKey("role", "role", "role");
  options.TokenValidationParameters.RoleClaimType = "role";