使用 IdentityServer4 在 API 中添加自定义访问声明

Adding custom Claim for access in API with IdentityServer4

我正在尝试使用一个应用程序来使用 IdentityServer4,它具有身份服务器、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);
}

我的问题是,当我登录到身份服务器时,我可以看到额外的声明 - 但是当我从 MVC 应用程序调用我的 API 时,我的自定义声明不存在。这是我的 MVC 应用程序中调用 API:

的代码
public async Task<IActionResult> ClientAuthorizedAPICall(string token)
{
    // discover endpoints from metadata
    var disco = await DiscoveryClient.GetAsync("http://localhost:5000");

    // request token
    var tokenClient = new TokenClient(disco.TokenEndpoint, "client", "secret");
    var tokenResponse = await tokenClient.RequestClientCredentialsAsync("testAPI");        

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

    var response = await client.GetAsync("http://localhost:5001/identity");
    ...
} 

我的 API 上的方法很简单:

[HttpGet]
public IActionResult Get()
{
    return new JsonResult(from c in User.Claims select new { c.Type, c.Value });           
}

我做错了什么吗?或者我应该做一些不同的事情而不是使用 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");

您可以在 quickstart on hybrid flow 中看到类似的方法。

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

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