通过Web API添加令牌中的声明

时间:2018-11-29 11:05:32

标签: asp.net-core asp.net-identity identityserver4 asp.net-core-webapi

我正在使用IdentityServer4,Identity和API进行项目。

API受IDS4保护。

API和IDS4在同一项目上,因此我的解决方案中有3个项目: -包含IdentityServer和AP​​I的MVC Web项目 -使用MongoDB作为数据库提供程序的Identity的实现 -一个模拟客户端的控制台应用程序

我的客户端通过IDS4进行身份验证,获取access_token,然后使用令牌调用api。这部分工作正常。

现在,我被问到在api中调用特定操作时,我会向令牌添加一些声明。

我已经在Google上进行搜索,但是找不到有关该操作的任何解决方案,而且我不确定这是个好主意。 API是否可以通过添加一些声明然后发送回令牌来修改接收到的访问令牌?

一种替代方法是发送另一个令牌作为响应,但是我找不到用RS512签名令牌的方法。

预先感谢

1 个答案:

答案 0 :(得分:0)

您可以使用IProfileService

添加其他声明
public class ProfileService : IProfileService
{
    public Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        string subject = context.Subject.Claims.ToList().Find(s => s.Type == "sub").Value;
        try
        {
            // Get Claims From Database, And Use Subject To Find The Related Claims, As A Subject Is An Unique Identity Of User
            //List<string> claimStringList = ......
            if (claimStringList == null)
            {
                return Task.FromResult(0);
            }
            else {
                List<Claim> claimList = new List<Claim>();
                for (int i = 0; i < claimStringList.Count; i++)
                {
                    claimList.Add(new Claim("role", claimStringList[i]));
                }
                context.IssuedClaims = claimList.Where(x => context.RequestedClaimTypes.Contains(x.Type));
                return Task.FromResult(0);
            }
        }
        catch
        {
            return Task.FromResult(0);
        }
    }

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

在“启动”文件中注册服务:

public void ConfigureServices(IServiceCollection services)
{
    services.AddIdentityServer()..Services.AddTransient<IProfileService, ProfileService>();
}