IdentityServer4如何创建身份令牌?

Posted

技术标签:

【中文标题】IdentityServer4如何创建身份令牌?【英文标题】:IdentityServer4 how to create identity token? 【发布时间】:2018-10-05 17:52:05 【问题描述】:

我遵循几个教程和 IdentityServer4 文档及其术语:Terminology 但我不明白哪个端点为用户获取 id 令牌。 我想我可以改变现有的方式来获得访问令牌来获取 id 令牌,但是没有一个方法给出结果:

        var disco = new DiscoveryClient("http://localhost:55678");
        var discoResponse = disco.GetAsync().Result;
        if (discoResponse.IsError)
        
            return null;
        

        var tokenClient = new TokenClient(discoResponse.TokenEndpoint, "mvc", "secret");
        var tokenResponse = tokenClient.RequestResourceOwnerPasswordAsync(context.EmailAddress, context.Password, "email");
        var token = tokenResponse.Result;

我了解resourceownerpassword方式仅用于使用密码访问资源,不用于识别用户。

当我尝试配置我的 jwtendpoint 时,我想我可以询问一个 id 令牌但没有结果:

        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(opts =>
            
                opts.Authority = "http://localhost:55678/";
                opts.Audience = "api1";
                opts.RequireHttpsMetadata = false;
                opts.SaveToken = true;
            );

我不知道哪个端点用户获取 jwt id 令牌。

【问题讨论】:

您是否遇到任何错误?如果 discoResponse.IsError 返回 null 但不输出任何信息。那是代码被破坏的地方吗?您应该检查discoResponse.ErrortokenResponse.Error - 这可能会让您了解问题所在。 没有错误,我调试并且发现点没问题,但我真正的问题是我得到 access_token 而不是 id_token 是空的。 只是出于好奇——为什么要授予资源所有者密码? 因为我想为使用密码的用户授予访问权限.... 用户名/密码也可用于其他流程:“...一般建议是使用隐式或混合等交互式流程来代替用户身份验证。”来自docs.identityserver.io/en/release/topics/… 【参考方案1】:

您无法通过密码授予获得身份令牌

用于获取身份令牌的端点是Authorize EndPoint,但您不能将密码授予与此端点一起使用。

您可以使用访问令牌从UserInfo Endpoint访问用户信息(声明)

【讨论】:

以上是关于IdentityServer4如何创建身份令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 IdentityServer4 访问令牌和 [Authorize] 属性

如何在 identityserver4 中没有用户名和密码的情况下从令牌端点获取令牌?

没有 cookie 的 IdentityServer4 外部身份验证

如何在 DRF 中使用身份服务器 4 验证 JWT 令牌?

带有存储在 cookie 中的刷新令牌的 SPA - 如何使用 IdentityServer4 进行配置?

如何测试我的令牌是不是使用 IdentityServer4 刷新?