实现输入用户名和密码的授权代码流

时间:2017-10-26 13:47:07

标签: .net-core identityserver4

我是Identity Server 4的新成员。 我部署了一个包含三个项目的解决方案:控制台应用程序,Web api和Identity Server 4。 我想获得一个访问令牌,在我的控制台应用程序中输入用户名和密码。 我问是否有可能在没有使用资源所有者密码流的情况下这样做,但只使用混合流?如何在我的控制台应用程序中执行此操作?

更新问题

我正在部署控制台应用程序来模拟作为最终目标的本机应用程序。在阅读了几个文档之后,我决定使用授权代码流,这就是我的需要。

问题是用户(在这种情况下是我的控制台应用程序)必须输入用户名和密码才能进行身份验证。但是使用授权代码我验证客户端,而不是用户。正确?

我这样说是因为我无法向授权端点发送用户名和密码来获取授权码。

在使用授权代码流对客户端进行身份验证之前是否有,然后使用资源所有者密码流对用户进行身份验证? 步骤是什么?

2 个答案:

答案 0 :(得分:0)

让我定义一些授权类型和IdentityServer4支持的其他术语,以帮助回答问题。

这取自IdentityServer documents和Scott Brady的blog

访问令牌reference

访问令牌表示授予客户端访问某些受保护资源的权限。

资源所有者密码流

客户端通常直接从用户接收用户名和密码,并将其传递给授权服务器(IdentityServer4)并接收访问令牌。

客户端没有response_type,授权服务器上的客户端将被定义为:

new Client
{
    ClientId = "ResourceOwnerCodeFlowClient",
    ClientName = "Resource Owner Code Flow Client",
    AllowedGrantTypes = GrantTypes.ResourceOwnerPassword

    //....Other properties to complete the client
}

混合流程

这是一个与使用隐式和授权代码流相同的流程。 这些将在客户端上定义为response_type 'code id_token',在Authorization Server上定义为:

new Client
{
    ClientId = "HybridCodeFlowClient",
    ClientName = "Hybrid Code Flow Client",
    AllowedGrantTypes = GrantTypes.Hybrid

    //....Other properties to complete the client
}

授权代码流程

这用于获取经常与身份令牌或访问令牌交换的授权代码。这也可用于验证客户端应用程序。这些将在客户端上定义为response_type 'code',在Authorization Server上定义为:

new Client
{
    ClientId = "AuthCodeFlowClient",
    ClientName = "Authorizate Code Flow Client",
    AllowedGrantTypes = GrantTypes.Code

    //....Other properties to complete the client
}

隐含流量

授权服务器在用户登录服务器后直接返回访问令牌。这些将在客户端上定义为response_type 'token',在Authorization Server上定义为:

new Client
{
    ClientId = "ImplicitCodeFlowClient",
    ClientName = "Implicit Code Flow Client",
    AllowedGrantTypes = GrantTypes.Implicit

    //....Other properties to complete the client
}

客户端凭据流

通常用于不需要特定用户时的机器到机器身份验证。授权服务器使用访问令牌进行响应。这些将在客户端上定义为response_type 'token',在Authorization Server上定义为:

new Client
{
    ClientId = "ClientCredentialsCodeFlowClient",
    ClientName = "Client Credentials Code Flow Client",
    ClientSecrets = 
                {
                    new Secret("secret".Sha256())
                },
    AllowedGrantTypes = GrantTypes.ClientCredentials

    //....Other properties to complete the client
}

<强> 答案:

非互动用户 如果您使用控制台应用程序作为解决方案的最终设计选择,并且没有直接的用户输入,那么它将更像服务,您应该使用Client Credentials Grant Type

互动用户 如果您将拥有将以交互方式使用控制台应用程序的用户,请继续使用资源所有者密码流,因为由于包含授权代码流,混合流将强制登录在授权服务器上进行。

答案 1 :(得分:0)

建议在使用隐式或混合流时使用系统浏览器进行身份验证,并且在测试控制台应用程序中执行此操作当然可以像在完整的桌面应用程序或移动应用程序中一样。 查看此库:https://github.com/IdentityModel/IdentityModel.OidcClient2,特别是此示例:https://github.com/IdentityModel/IdentityModel.OidcClient2/tree/release/clients/ConsoleClientWithBrowser