遵循了IdentityServer4的官方文档,我到达了一个MVC客户端应用程序,IdentityServer4和一个Web Api(运行资源服务器)的地步。IS4主页显示了该用户的所有声明,并且当使用访问令牌调用api时,我们再次得到所有用户的声明。
示例代码在此处可用,尽管可能没有必要,但我只是缺少一些明显的东西。
无论如何,为了简单起见,我们不要从数据库中获取声明,而只是分配一个随机的硬编码的声明:
public class ProfileService : IProfileService
{
public Task GetProfileDataAsync(ProfileDataRequestContext context)
{
context.IssuedClaims.Add(new System.Security.Claims.Claim("role", "admin"));
return Task.FromResult(0);
}
...
}
我在启动文件中注册了定制Profile服务,现在当我登录IS4时,看到了其他声明。
但是,在调用Web api(资源服务器)时,此附加声明不包括在JWT中。api调用代码:
public async Task<IActionResult> CallApiUsingUserAccessToken()
{
var accessToken = await HttpContext.Authentication.GetTokenAsync("access_token");
var client = new HttpClient();
client.SetBearerToken(accessToken);
var content = await client.GetStringAsync("http://localhost:5001/identity");
ViewBag.Json = JArray.Parse(content).ToString();
return View("json");
}
(所有api所做的就是返回User.Claims的列表)。我添加的声明不存在,并且当我调试代码并选择访问令牌字符串并在jwt.io上对其进行解码时,再也没有这样的声明。
问题是:我想念什么?HttpContext.Authentication.GetTokenAsync对我的用例不利吗?如果是,那么-我应该使用什么替代品?
编辑:这是OpenId Connect选项(在MVC客户端上):
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
AuthenticationScheme = "oidc",
SignInScheme = "Cookies",
Authority = "http://localhost:5000",
RequireHttpsMetadata = false,
ClientId = "mvc",
ClientSecret = "secret",
ResponseType = "code id_token",
Scope = { "api1", "offline_access" },
GetClaimsFromUserInfoEndpoint = true,
SaveTokens = true
});
我想原因是您尚未为您的API分配任何声明。这就是为什么我们根本不致电个人资料服务的原因。
这是一个普遍的问题,并且有些矛盾,因为我们一直在为身份令牌调用配置文件服务。
我们在1.0.2中更改了此行为
https://github.com/IdentityServer/IdentityServer4/releases/tag/1.0.2
请重试,看看是否能达到预期效果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句