C# 在具有IdentityServer4的API中添加访问的自定义声明

C# 在具有IdentityServer4的API中添加访问的自定义声明,c#,asp.net-core,asp.net-identity,openid-connect,identityserver4,C#,Asp.net Core,Asp.net Identity,Openid Connect,Identityserver4,我正在尝试使用一个应用程序来使用IdentityServer4,它具有identity server、MVC客户端和web API的基本设置 我有一个自定义配置文件服务(我已在Startup.cs中注册),在这里我添加了一个自定义声明,下面是我的GetProfileDataAsync方法: public Task GetProfileDataAsync(ProfileDataRequestContext context) { var user = _userManager.GetUser

我正在尝试使用一个应用程序来使用IdentityServer4,它具有identity server、MVC客户端和web API的基本设置

我有一个自定义配置文件服务(我已在Startup.cs中注册),在这里我添加了一个自定义声明,下面是我的
GetProfileDataAsync
方法:

public Task GetProfileDataAsync(ProfileDataRequestContext context)
{
    var user = _userManager.GetUserAsync(context.Subject).Result;

    var claims = new List<Claim>
    {
        new Claim("TestFullName", user.FullName),
    };

    context.IssuedClaims.AddRange(claims);          

    return Task.FromResult(0);
}

我做错什么了吗?或者我应该做一些不同的事情,而不是使用
User.Claims

就像rawel的评论所说的那样,您需要使用MVC应用程序用户的访问令牌来进行API调用。它看起来像这样:

// get the current user's access token
var accessToken = await HttpContext.GetTokenAsync("access_token");

// call api
var client = new HttpClient();
client.SetBearerToken(accessToken);

var response = await client.GetAsync("http://localhost:5001/identity");
您可以在中看到类似的方法

要将自定义用户声明放入API的访问令牌中,您需要在定义API资源时包含它。例如:

new ApiResource("testAPI", "Test API", new[] { "TestFullName" }),

如果您在
GetProfileDataAsync()
中设置断点,是否会调用该断点?@Peter-是的,当我登录时会添加声明。因此,您登录到您的MVC应用程序(通过IdentityServer)时,MVC应用程序中的用户拥有声明,并且所有操作都正常。但看起来MVC应用程序中有一个操作,它使用客户端凭据获取访问令牌来调用API端点。。。您想知道为什么API中没有该声明?是的,没错,当用户登录到MVC应用程序时,您需要发送从identity server收到的访问令牌。从客户端凭据流接收的访问令牌无法知道用户是谁。谢谢@Peter,这确实有效。我不知道为什么,但是使用你的方法让访问令牌工作,但我的没有,即使他们都给我相同的访问令牌。知道为什么吗?这很奇怪-我不希望客户端凭据访问令牌与用户的访问令牌相同。客户端凭据令牌不应包含任何用户/身份声明。因此,如何向令牌添加自定义声明?
// get the current user's access token
var accessToken = await HttpContext.GetTokenAsync("access_token");

// call api
var client = new HttpClient();
client.SetBearerToken(accessToken);

var response = await client.GetAsync("http://localhost:5001/identity");
new ApiResource("testAPI", "Test API", new[] { "TestFullName" }),