使用 SPA 为授权代码流配置 Identity Server 3 的正确方法是啥?

Posted

技术标签:

【中文标题】使用 SPA 为授权代码流配置 Identity Server 3 的正确方法是啥?【英文标题】:What is the correct way to configure Identity Server 3 for authorization code flow with SPAs?使用 SPA 为授权代码流配置 Identity Server 3 的正确方法是什么? 【发布时间】:2019-10-11 14:42:45 【问题描述】:

我们有一个 Identity Server 3 的实例,它已经与各种客户端一起使用了一段时间,一些使用隐式流,另一些使用客户端凭据。我们现在有一个新要求,将 ios 原生应用程序与此身份提供程序集成。我知道这些天不建议使用隐式流程,而面向公众的应用程序应该使用授权代码流程。此类建议的示例是 here 和 here。

据我了解,授权代码流程有一个步骤,通过将接收到的授权代码与客户端 ID 和密码一起提供,通过某个反向通道将其交换为 JWT 令牌。但是,对于 SPA 和本机应用程序,我们没有存储秘密的奢侈。我found here 的指导建议我可以简单地从connect/token 请求中省略秘密,但到目前为止我的测试并没有证实这一点。所以我被困住了。为了演示,我在我的本地 IS3 实例上设置了一个客户端进行测试:


    'clientId': 'test',
    'flow': 'AuthorizationCode',
    'name': 'test',
    'redirectUris': [ 'http://localhost:8080/' ], 
    'scopes': ['openid','profile']

然后我向我的 IdP 发出以下 GET 请求:

[ID_PROVIDER]/connect/authorize?client_id=test&redirect_uri=http%3A%2F%2Flocalhost%3A8080&scope=openid%20profile&response_type=code

这让我可以登录并返回到在http://localhost:8080 运行的测试应用程序,并在查询字符串中使用我的授权码。

我现在尝试通过 POSTing 到 [ID_PROVIDER]/connect/token 使用以下正文将此代码交换为 JWT 令牌:code=[AUTH_CODE]&grant_type=authorization_code&client_id=test&redirect_uri=http%3A%2F%2Flocalhost%3A8080

但 Identity Server 以 HTTP 400 和 invalid_client 错误拒绝此操作。当我深入研究它的日志时,我看到了一个 ClientSecretValidator 事件,其中包含消息“未找到客户端机密”。根据我上面概述的理解,哪种是有意义的,但鉴于人们建议将此流程用于面向公众的应用程序,我一定是误解了一些东西。

如果有人能澄清一下,那就太好了,谢谢。

【问题讨论】:

您的标题说 SPA,但从您的问题来看,您似乎想从原生 iOS 应用程序进行身份验证。是哪一个? 我意识到我在两者之间跳跃,但我不确定这是否重要。它们都是不能信任机密的客户端应用程序,因此就其 OIDC 配置而言,它们的处理方式与我所想的相同。 【参考方案1】:

您不能只省略客户端密码。对于您的本地情况,我会考虑将秘密嵌入应用程序中。授权请求仍然需要验证 return_uri(您的原生应用的自定义 URI 方案),如果这仍然不安全,您还可以依靠拥有证明 (PoP) 令牌 (https://identityserver.github.io/Documentation/docsv2/pop/overview.html)。

对于 SPA 应用程序,我会保留它的隐式流程,我认为在那里做秘密没有意义。

【讨论】:

以上是关于使用 SPA 为授权代码流配置 Identity Server 3 的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

SignalR 授权无法在带有 Identity Server 的 asp.net core angular SPA 中开箱即用

将 Google OIDC 与代码流和 PKCE 结合使用

使用 Auth0 授权来自我们的 SPA 和其他后端服务的 API 请求

使用 .Net 5 WebAPI 的 Vue SPA 的正确 OIDC 流程是啥?

Web API2 使用默认Identity

使用授权代码流获取具有有效刷新令牌的新令牌时出错