使用Identity Server 3,我可以使用相同的客户端凭据来获取承载令牌并执行Open ID Connect身份验证

时间:2017-04-04 07:47:56

标签: authentication oauth openid identityserver3

我对Identity Server的研究很早,但我已经完成了一些教程,并且觉得我已经超过了第一个障碍。我从Identity Server的Getting Started guide开始,然后转到Scott Brady的优秀的3部分教程starting here,该教程演示了如何使用混合客户端设置身份服务器以进行OIC身份验证。

因此,我现在有两个工作的例子。一个使用Flows.ClientCredentialsAccessTokenType.Reference通过IdentityModel.Client.TokenClient的客户端的ID和秘密来获取用于验证API调用的承载令牌(根据IS3的第一个入门示例)。另一个使用Flows.HybridAccessTokenType.Jwt的客户端为MVC Web应用程序执行Open ID身份验证(根据Scott Brady系列中的第3个)。

我正在努力提供一个身份服务器,让第三方编写可以获取承载令牌的应用程序,以便客户授权调用我的API调用,但也允许其自己的用户使用Open ID进行身份验证我的身份服务器。我目前的设置方式,我需要发布这些第三方的2套客户端凭证(ID和机密),以允许他们执行这些单独的功能。

这是正确的方法吗?我天真的假设是,这是混合流客户端的目的。但是,如果我使用我的混合客户端的凭据调用上面的示例代码(使用TokenClient的代码),则返回的错误是“unauthorized_client”,并且Identity Server日志告诉我“客户端未授权客户端凭据流”。

以下是我的2个客户的定义方式:

            new Client {
                ClientId = @"cc-client",
                ClientName = @"Example Client Credentials Client",
                ClientSecrets = new List<Secret> {
                    new Secret("idsrv3test".Sha256())
                },
                Enabled = true,
                Flow = Flows.ClientCredentials,
                AllowedScopes = new List<string> {
                    Scopes.SCOPE_CLIENT_STANDARD
                },
                AccessTokenType = AccessTokenType.Reference
            },
            // Testing with a hybrid client here which will log in via our Identity Server
            // https://www.scottbrady91.com/Identity-Server/Identity-Server-3-Standalone-Implementation-Part-3
            new Client {
                ClientId = @"hybridclient",
                ClientName = @"Example Hybrid Client",
                ClientSecrets = new List<Secret> {
                    new Secret("idsrv3test".Sha256())
                },
                Enabled = true,
                Flow = Flows.Hybrid,
                RequireConsent = true,
                AllowRememberConsent = true,
                RedirectUris = new List<string> {
                    "https://3p-client2.not-domain.local/"
                },
                PostLogoutRedirectUris = new List<string> {
                    "https://3p-client2.not-domain.local/"
                },
                AllowedScopes = new List<string> {
                    Constants.StandardScopes.OpenId,
                    Constants.StandardScopes.Profile,
                    Constants.StandardScopes.Email,
                    Constants.StandardScopes.Roles,
                    Constants.StandardScopes.OfflineAccess
                },
                AccessTokenType = AccessTokenType.Jwt
            }

如果有人能在这里澄清我的理解,那就太好了。感谢。

0 个答案:

没有答案