我正在努力了解如何通过IdentityServer4调用受保护的API。
基本上,我有以下网站: - IdentityServer应用程序, - 一个Web API和 - 客户端Web应用程序。
我的设置就像IdentityServer样本here。
我定义了代表我的客户端Web应用程序的Client
,以及代表我的Web Api的APIResource
。
在我的客户端Web应用程序中,我想对WebAPI进行HTTP调用,但我希望看起来好像我是登录用户,所以我想让Web Api可以使用'email'范围。
我在Web应用程序中的做法是获取'access_token',并将其传递给Web API:
var accessToken = await httpContextAccessor.HttpContext.Authentication.GetTokenAsync($"access_token");
var client = new HttpClient();
client.SetBearerToken(accessToken);
这允许我调用客户端,因此授权步骤正常,但Web Api上的用户声明没有适当的范围。
我做错了吗?
答案 0 :(得分:1)
access_token
可以包含IdentityServer4中的声明信息。必须在ApiResource定义中指定所需的声明。
否则,您必须发送JWT id_token以及请求。
new ApiResource(ApiResourceNames.SomeApiAccess, "Access to some api.", new List<string>(){
new IdentityResources.OpenId().Name,
new IdentityResources.Profile().Name,
new IdentityResources.Email().Name
}),
答案 1 :(得分:0)
您可以在网络API中添加范围
app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{
Authority = "https://demo.identityserver.io",
ApiName = "api1",
AllowedScopes = { "api1.read", "api1.write" }
});
您是如何配置网络API的?如果代码仍然不起作用,请发布代码!