身份服务器流

Posted

技术标签:

【中文标题】身份服务器流【英文标题】:IdentityServer Flows 【发布时间】:2015-06-23 09:14:50 【问题描述】:

IdentityServer 支持在 Flows 枚举中定义并为客户端设置的不同 OpenId Connect 流。还有每种类型的流的示例以及文档中对它们的许多引用,但我找不到documentation 中流的简单定义列表,好像它们太明显而无法用语言解释。但我想他们不是。您能否详细说明它们的区别,也许我们可以将其添加到文档中?

那么什么是:隐式流程、资源所有者密码凭证流程、授权码流程、客户端凭证流、自定义授权流和混合流?还有哪些是 OAuth 流,哪些是 OpenID Connect 流?

谢谢!

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,目前工作仍在进行中。当我完成文档时,我可能会在这里发布。暂时:请检查草稿:

Enrich IdentityServer Documentation with OIDC and OAuth2 Flows section #73

更新: OIDC and OAuth2 Flows

【讨论】:

另请参阅 DigitalOcean 的 introduction to OAuth 2.0。【参考方案2】:

来自 leastPrivilage 的第一个链接: 和Aharon Paretzki's OAuth 2 Simplified

流程决定ID令牌(即授权码)和访问令牌(即'令牌')返回给客户端:

授权码流程:OAuth 2.0流程在其中

从授权端点返回一个授权码 所有令牌(作为第二阶段,以换取授权码)都从令牌端点返回 用于可以维护其客户端机密机密性的基于服务器的调用 (API)。允许更强的安全性,只要没有人可以访问“客户端密码”。

隐式流:OAuth 2.0 流,其中

所有令牌都直接从授权端点返回 既不使用令牌端点也不使用授权码。 用于移动和基于 Web 的应用程序,无法维护客户端机密的机密性,因此需要由身份验证服务器本身颁发令牌。这不太安全,建议将服务器设置为拒绝 API 使用的 隐式流 调用,并仅允许基于浏览器和基于移动的应用程序调用。

混合流:OAuth 2.0 流,其中

从授权端点返回一个授权码, 一些令牌直接从授权端点返回,而其他令牌则从令牌端点返回(作为第二阶段,以换取授权代码)。 在需要两个流的地方使用。

【讨论】:

【参考方案3】:

查看规格 - 已经全部记录下来了:

http://openid.net/specs/openid-connect-core-1_0.html 和 https://www.rfc-editor.org/rfc/rfc6749

此外,我最近还写了一个总结,针对不同的应用程序类型对其进行了细分:

http://leastprivilege.com/2016/01/17/which-openid-connectoauth-2-o-flow-is-the-right-one/

【讨论】:

我知道,但我正在寻找更简短的描述。我发现您博客中的this 描述非常有用。 我还发现这是 Identity Server 的最大问题,因为关于产品的基本信息有限。实施该框架大约一个月后,极其详细的文档将被证明是有用的,但学习曲线并不陡峭,而是垂直的。 我实际上通过 Auth0.com 实施文档了解了更多关于 Identity Server 的信息,然后又回到了 Identity Server。 请随意写下所有内容并让我们知道,以便我们可以链接到它。它不是产品,它是 OSS。呻吟很容易。自己改进。 你是对的。我不应该抱怨。这是一个很好的资源,希望我能做出贡献。【参考方案4】:

OAuth2 中定义的流只是客户端从身份提供者服务器接收access token 的几种方式;在这种情况下,IdentityServer。除非您完全理解the flow diagrams 中指定的实体,例如Resource OwnerUser AgentResource Server,否则理解流并不容易。在here 中有一些关于这些实体(角色,珍贵)的简要说明。


授权代码流程:在发出access token之前发出authorization code

客户端请求authorization code. IdentityServer 验证客户端并要求资源所有者授予发出authorization code 的授权。 然后客户端使用给定的authorization code 请求access token 授权服务器直接向客户端发出access token

隐式代码流:即使没有提供authorization code,也会发出access token

客户端直接请求access tokenIdentityServer 跳过验证客户端(在某些情况下,它会部分验证)但仍要求资源所有者授予发出access token 的授权 此流程从不发出authorization code

隐式流被认为是使用javascript等脚本语言的客户端的理想流,因为客户端不必分别请求authorization codeaccess token,在反过来,为客户端减少了一次网络往返。


客户端凭据流:在未经资源所有者许可的情况下发出access token

客户端直接请求访问令牌。 IdentityServer 验证客户端并立即发出access token

当客户端也是资源所有者时这是理想的,因此它不需要任何授权权限一直到access token


资源所有者流程:如果客户端拥有资源所有者的凭据(例如 Id / 密码),则发出 access token

客户端直接请求access tokenIdentityServer 验证客户端并检查资源所有者的身份。 如果有效,客户端会立即获得access token

此流程非常适合您认为与他们共享 ID 和密码绝对安全的客户。


混合流(OIDC 流):发出authorization codeaccess token

这是Authorization code flowImplicit code flow 的组合。这就是为什么它被称为Hybrid


自定义流程

这实际上是一个可定制的流程。除了OAuth2 中的所有协议规范之外,当您的业务需要特定的身份验证/验证流程时,可以使用此功能。

IdentityServer 很清楚这种情况,它通过设计支持可扩展性。工厂模式、装饰器模式和 IoC / DI 将使您更容易在 IdentityServer 上实现附加功能。

【讨论】:

以上是关于身份服务器流的主要内容,如果未能解决你的问题,请参考以下文章

身份服务器刷新令牌资源所有者密码凭证流

继续与 OIDC JS 客户端和身份服务器进行会话 4 授权流与 Azure 应用服务上的 PKCE 流

Cordova AAD 服务器流身份验证在 Android 和 iOS 上挂起

身份验证失败,因为远程方已关闭传输流

java.net.HttpRetryException:由于服务器身份验证而无法重试,在流模式下

云计算OpenStack:keystone身份认证服务--技术流ken