Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未包含在JWT中且未发送到Web Api的IdentityServer 4用户声明_C#_Asp.net Core_Openid Connect_Identityserver4 - Fatal编程技术网

C# 未包含在JWT中且未发送到Web Api的IdentityServer 4用户声明

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

在正式的IdentityServer4文档之后,我得到了一个MVC客户端应用程序、IdentityServer4和一个Web Api(正在运行的资源服务器)。IS4主页显示用户的所有声明,当使用访问令牌调用api时,我们再次得到用户的所有声明

示例代码是可用的,尽管它可能不是必需的,我只是缺少一些明显的东西

无论如何,为了简单起见,我们不要从DB获得索赔,只需分配一个随机硬编码的索赔:

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
        });