【问题标题】:Implementing Authorization code flow entering username and password实现授权码流程输入用户名和密码
【发布时间】:2017-10-28 03:38:31
【问题描述】:

我是 Identity Server 4 的新手。 我正在部署一个包含三个项目的解决方案:控制台应用程序、Web api 和 Identity Server 4。 我想在我的控制台应用程序中获取一个输入用户名和密码的访问令牌。 我问是否可以不使用资源所有者密码流而仅使用混合流来做到这一点?如何在我的控制台应用程序中执行此操作?

更新问题

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

问题是用户(在本例中是我的控制台应用程序)必须输入用户名和密码才能进行身份验证。但是使用授权码我验证了客户端,而不是用户。对吧?

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

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

【问题讨论】:

  • 是否要求 SPA 应用程序有自己的登录屏幕,或者您是否同意登录屏幕位于 IdentityServer 上的典型方法?您通常希望这样做以防止设备上的某些内容获取用户名和密码。
  • @aaronR 理想的情况是使用 App 的登录屏幕,而不是 Identity Server 的登录屏幕。我发现了很多典型方法的示例,其中登录屏幕位于身份服务器上。但我需要使用应用程序的登录屏幕。
  • 如果这是像移动应用程序一样安装的东西,您知道这种方法的安全风险吗?
  • 有这样的例子吗?使用授权代码流使用自己的登录页面的移动应用程序的身份验证?这种方法有什么风险? @aaronR
  • 首先我不确定你是否可以混合使用这两者。其次,安全风险是移动设备上的另一个应用程序或恶意代码可能会监听并窃取用户名和密码。如果您使用 IdentityServer4 或任何其他受 SSL 证书保护的服务器,则窃取用户名和密码要困难得多。

标签: .net-core identityserver4


【解决方案1】:

让我定义一些授权类型和 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',在授权服务器上定义为:

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

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

授权码流程

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

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

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

隐式流

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

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

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

客户凭证流程

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

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

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

【讨论】:

  • 感谢您的回答。我正在部署一个控制台应用程序来模拟一个本机应用程序,它将成为最终选择。因此,用户必须在移动应用程序中输入用户名和密码,并且移动应用程序必须通过身份服务器进行身份验证。我问授权代码流在我的情况下是否是最好的方法?为什么不是混合流?
  • 如果您的最终目标是拥有一个原生应用程序,那么请将其添加到问题中,我将添加到我的答案中。
【解决方案2】:

建议在使用隐式或混合流时使用系统浏览器进行身份验证,并且在测试控制台应用程序中这样做当然与在成熟的桌面应用程序或移动应用程序中一样可能。 查看这个库:https://github.com/IdentityModel/IdentityModel.OidcClient2,尤其是这个示例:https://github.com/IdentityModel/IdentityModel.OidcClient2/tree/release/clients/ConsoleClientWithBrowser

【讨论】:

  • 我更新了问题,因为我需要在阅读不同的文档后使用授权码流。我问是否可以在控制台应用程序(模拟本机应用程序)中使用授权代码流。
猜你喜欢
  • 2018-11-04
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 2018-03-13
  • 2014-10-31
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多