我尝试使用应用程序来使用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
?
答案 0 :(得分:2)
与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" }),