C# 未包含在JWT中且未发送到Web Api的IdentityServer 4用户声明
在正式的IdentityServer4文档之后,我得到了一个MVC客户端应用程序、IdentityServer4和一个Web Api(正在运行的资源服务器)。IS4主页显示用户的所有声明,当使用访问令牌调用api时,我们再次得到用户的所有声明 示例代码是可用的,尽管它可能不是必需的,我只是缺少一些明显的东西 无论如何,为了简单起见,我们不要从DB获得索赔,只需分配一个随机硬编码的索赔:C# 未包含在JWT中且未发送到Web Api的IdentityServer 4用户声明,c#,asp.net-core,openid-connect,identityserver4,C#,Asp.net Core,Openid Connect,Identityserver4,在正式的IdentityServer4文档之后,我得到了一个MVC客户端应用程序、IdentityServer4和一个Web Api(正在运行的资源服务器)。IS4主页显示用户的所有声明,当使用访问令牌调用api时,我们再次得到用户的所有声明 示例代码是可用的,尽管它可能不是必需的,我只是缺少一些明显的东西 无论如何,为了简单起见,我们不要从DB获得索赔,只需分配一个随机硬编码的索赔: public class ProfileService : IProfileService { pub
public class ProfileService : IProfileService
{
public Task GetProfileDataAsync(ProfileDataRequestContext context)
{
context.IssuedClaims.Add(new System.Security.Claims.Claim("role", "admin"));
return Task.FromResult(0);
}
...
}
我在启动文件中注册了自定义配置文件服务,现在当我登录到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分配任何声明。这就是为什么我们根本不打电话给档案服务 这是一个常见的问题,而且有点不一致,因为我们总是为身份令牌调用配置文件服务 我们在1.0.2中更改了此行为
请再试一次,看看这是否会给您带来预期的结果。请提供
OpenIdConnectOptions
,如果您正在使用,我不确定我是否理解正确,但仅仅因为您在web方法的服务器端添加了一个新声明,这并不意味着您重新发布了令牌以实际包含此新声明。尝试其他方法,例如删除所有声明,效果应该是相同的。除非您发出新令牌,否则您在服务器上对标识所做的更改是临时的,并且仅在此类特定请求期间持续。类似于从服务器上的cookie集合中删除cookie,但不发送新的cookie集以在客户端实际删除它。确实如此,非常感谢!我想这从来都不是一个bug,但是新的IS4版本省去了很多麻烦,因为openId connect的大多数方面都不是直观的。如何添加电子邮件和用户名声明,当它们没有在AspNetUserClaims中明确添加时?@leastprivilege澄清,您的意思是,通过此修改,IProfileService设置的声明现在总是添加到标识令牌和访问令牌中?而旧的行为只是将它们附加到身份令牌上?这似乎就是我所看到的,从1.0.0移动到1.1.1。从提交的读取来看,似乎确实为每个令牌类型查询了IProfileService
。
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
});