IdentityServer4用户的声明未包含在JWT中,未发送到Web Api

时间:2017-01-15 18:17:51

标签: c# asp.net-core openid-connect identityserver4

遵循官方IdentityServer4文档,我达到了我有一个MVC客户端应用程序,IdentityServer4和Web Api(运行资源服务器)的程度。 IS4主页显示用户的所有声明,并且当使用访问令牌呼叫api时,我们再次得到所有用户的声明。

示例代码可用here,虽然可能没有必要,但我只是遗漏了一些明显的东西。

无论如何,为了简单起见,让我们不要从数据库获得声明,只是分配一个随机的硬编码:

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都返回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
        });

1 个答案:

答案 0 :(得分:2)

我想原因是您尚未向您的API分配任何声明。这就是我们根本不打电话给个人资料服务的原因。

这是一个常见问题,并且有点不一致,因为我们总是为身份令牌调用配置文件服务。

我们在1.0.2

中更改了此行为

https://github.com/IdentityServer/IdentityServer4/releases/tag/1.0.2

请再试一次,看看这是否能为您提供预期效果。