asp.net - 为 SPA 的授权代码流配置 Identity Server 3 的正确方法是什么?
问题描述
我们有一个 Identity Server 3 的实例,它已经与各种客户端一起使用了一段时间,一些使用隐式流,另一些使用客户端凭据。我们现在有一个新的要求,将 iOS 原生应用程序与此身份提供者集成。我知道这些天不建议使用隐式流程,而面向公众的应用程序应该使用授权代码流程。此类建议的示例在此处和此处。
据我了解,授权代码流有一个步骤,通过将接收到的授权代码与客户端 ID 和机密一起提供,通过某个反向通道将接收到的授权代码交换为 JWT 令牌。但是,对于 SPA 和本地应用程序,我们没有存储秘密的奢侈。我在这里找到的指导建议我可以简单地从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上运行的测试应用程序,并在查询字符串中使用我的授权代码。
我现在尝试通过使用以下正文将此代码交换为 JWTPOST
令牌[ID_PROVIDER]/connect/token
:code=[AUTH_CODE]&grant_type=authorization_code&client_id=test&redirect_uri=http%3A%2F%2Flocalhost%3A8080
但 Identity Server 拒绝此操作并返回 HTTP 400 和invalid_client
错误。当我深入研究它的日志时,我看到一个ClientSecretValidator
带有“未找到客户端密码”消息的事件。根据我上面概述的理解,哪种是有意义的,但是鉴于人们建议将此流程用于面向公众的应用程序,我一定是误解了一些东西。
如果有人能澄清一下,那就太好了,谢谢。
解决方案
您不能只省略客户端密码。对于您的本地情况,我会考虑将秘密嵌入应用程序中。授权请求仍然必须验证 return_uri(您的本地应用程序的自定义 URI 方案),如果仍然感觉不安全,您还可以依靠拥有证明 (PoP) 令牌(https://identityserver.github.io/Documentation /docsv2/pop/overview.html)。
对于 SPA 应用程序,我会保留它的隐式流程,我认为在那里做秘密没有意义。
推荐阅读
- python - 下载 gensim 数据集时出现 ValueError
- javascript - 如果我使用传播运算符,为什么状态会更新为最新消息?
- javascript - Sencha Ext Js 正确的用户名和密码
- mysql - 只是想知道如何使用合并语句将下面的查询转换为 oracle 查询?
- c++ - 用字符串中的正斜杠替换反斜杠(std::replace 适用于 Windows,但不适用于 linux)
- mysql - Having problems with complex query (Laravel Eloquent)
- javascript - 如何进入嵌套对象结构中的每个对象?
- php - 更新 woocommerce 产品时使用大量 php 内存
- c# - 从 Xamarin 条目外的物理激光扫描仪捕获输入
- mysql - 如何从 typeorm querybuilder 中的返回列中删除前缀