1

如果我将此示例中的客户端更改为“native.hybrid” https://github.com/IdentityModel/IdentityModel.OidcClient.Samples/tree/master/WinFormsWebView

并设置 Flow = OidcClientOptions.AuthenticationFlow.Hybrid

然后登录到 IS4 工作(延迟 5 秒后),但我的默认 Web 浏览器中出现了一个新的登录表单。

使用客户端“interactive.public”可以正常工作。我的问题是我的原生寡妇应用程序应该使用哪个流程?我的意思是它是“OpenID Connect 混合流程”,请参阅https://identityserver4.readthedocs.io/en/latest/topics/grant_types.html

如果使用混合流,如何适应这个样本?

4

1 回答 1

0

选择与 OIDC 一起使用的授权的当前经验法则是:

  • 机器对机器通信:使用 ClientCredentials

  • 交互式客户端(Web 应用程序、SPA 或本机/移动应用程序):使用代码 + PKCE


ClientCredentials:此流程包含对令牌端点的单个请求,提供 client_id 和 client_secret(如用户/密码)以根据权限对自身进行身份验证。


Code+PKCE:此流程包含两个请求:

  1. 授权端点的请求将在 Front-Channel 中完成,在任何情况下都使用 Web 浏览器,并将响应(如果成功)重定向到提供的redirect_uri(先前在服务器上配置)。在此重定向中,权限将在其他参数中添加“代码”作为“片段”或“查询”(example.com/signin#code=1234)。

  2. 对令牌端点的请求,提供接收到的代码,该代码将以请求的实际令牌进行响应。

这里的问题是如何验证发出第二个请求的客户端。在混合流程中,我们使用一个秘密,就像客户端凭据一样,问题是并非所有应用程序都能够安全地维护这个秘密(即:SPA 将其所有代码加载到客户端浏览器上,因此任何人都可以窃取该秘密) (这就是我们区分机密(能够保密)和公共客户的原因)。

这是 PKCE 派上用场的时候:它通过添加额外的检查来增强此流程的安全性:

  1. 在第一个授权请求中,客户端先前创建了一个随机字符串“asdfasdf”并计算其哈希值。该哈希值与用于计算它的算法一起添加到请求中,例如:SHA256。

  2. 在第二个请求中,客户端将字符串包含在纯文本“asdfasdf”中,这样​​授权机构可以计算该字符串的哈希值并检查它是否与第一个请求中提供的匹配。如果是这样,那么我们可以得出结论,发出第二个请求的客户端与发出第一个请求的客户端相同。鉴于第一个请求以先前配置redirect_uri的方式结束,只有授权客户端才能完成流程。

于 2019-12-11T13:24:59.883 回答