c# - IdentityServer4 用户的声明未包含在 JWT 中且未发送到 Web Api

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

按照官方 IdentityServer4 文档,我已经有了一个 MVC 客户端应用程序、IdentityServer4 和一个 Web Api(正在运行的资源服务器)。 IS4 主页显示用户的所有声明,当使用访问 token 调用 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 的列表)。我添加的声明不在那里,当我调试代码并选择访问 token 字符串并在 jwt.io 上对其进行解码时,又没有这样的声明。

问题是:我错过了什么? HttpContext.Authentication.GetTokenAsync 是否不适合我的用例,如果是这样 - 我应该使用什么替代品?

编辑:以下是 OpenId 连接选项(在 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 分配任何声明。这就是我们根本不调用配置文件服务的原因。

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

我们在 1.0.2 中更改了此行为

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

请再试一次,看看这是否会给您带来预期的结果。

关于c# - IdentityServer4 用户的声明未包含在 JWT 中且未发送到 Web Api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41664604/

相关文章:

asp.net-core - 您如何使用 .net Core 进行离线开发设​​置

c# - asp.net core 2.0如何获取请求的浏览器名称和版本

oauth-2.0 - OpenID 提供商如何对最终用户进行身份验证?

c# - Filesystemwatcher 导致 "Error too many changes at once in directory C:\"

c# - 阻止 PictureBox 接收事件 C#

Azure Webjobs 控制面板?

apache - mod-auth-openidc 的用户列表

azure - 已删除应用程序中的用户,因此 AAD SCIM 配置不会修改/创建用户,因为它仍然缓存为 AAD 中现有的。怎么去掉?

c# - 是否可以在 View 中使用 ValueTuple 作为模型?

c# - 重载导致代码膨胀