添加具有IdentityServer4的API访问权限的自定义索赔4



我正在尝试使用应用程序使用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);
}

我的问题是,当我登录身份服务器时,我可以看到其他索赔 - 但是当我从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 App用户的访问令牌来进行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中看到类似的方法。

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

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

相关内容

  • 没有找到相关文章

最新更新