我正在构建一个将连接到 API 的 WPF .NET Windows 应用程序。因为我们还有其他 API,所以我想开始将所有登录逻辑放入以标准化方式处理它的单个模块/服务中。我认为 OpenID Connect (OIDC) 是一个很好的协议(protocol)。
据我所知,使用 PKCE 的授权代码流是这里的方法。如果我以正确的方式进行此操作,我希望有人为我确认。以下是我想我需要实现的流程:
我认为 native 客户端应该在将每个请求发送到 API 之前检查 access_token。如果 access_token 已过期或即将过期(可能在 < 30 秒内),则在发送请求之前获取新的 access_token。
让我对此感到不确定的是没有重定向到 API。许多流程将用户重定向到 OP,然后重定向回 API。我想这没有的原因是因为它是原生的并且不直接支持重定向到浏览器那样的页面。
我会以正确的方式解决这个问题吗?
最佳答案
我认为 OpenID Connect (OIDC) 是一个很好的协议(protocol)
如果您想将用户身份与应用程序分开,OIDC 和 OAuth 2.0 是最佳选择。这意味着您不会将它们保存在应用程序的末尾,而是通过 Azure AD、ADFS 甚至 Google。如果您更喜欢基于 token 的身份验证和授权,这也是正确的选择。这意味着您信任由授权服务器(也称为身份提供者或 OP)颁发的 token ,这比通过基本身份验证传递用户名/密码更安全。
使用 PKCE 的授权码流程是这里的方法
正确的。 native 应用程序(例如您正在创建的在用户的 Windows 机器上运行的应用程序)应使用 PKCE 和身份验证。代码流。
关于流量
我不确定第二步,After the user logs in, the refresh token and access token are returned using a POST redirect that the application can intercept.
我猜你是从授权请求中获取 token ?不确定您在这里的意思,但理想情况下必须发生的是您应该在用户登录浏览器实例后获取授权码。一旦你得到了,你必须直接调用token
身份提供者的端点。作为此 token 请求的结果,您将获得 token 。它也有 PKCE 完成步骤。
还有The native application uses that access token to get user info and display profile information in the app
.为此,您可以使用 token 响应中的 ID token 。它包含最终用户信息。请从 protocol's explanation 查看更多信息.
从 API 端,是的,它必须检查调用的有效性与 API 请求附带的访问 token 。为此,它可以在第一次看到新的访问 token 时使用 user_info 端点,然后缓存详细信息。在以后的调用中,它可以使用缓存的信息来检测用户信息。此外,一些 OP 发送基于 JWT 的访问 token ,您的 API 可以读取和检测到期详细信息。
我认为 native 客户端应该在将每个请求发送到 API 之前检查 access_token。
不。!它必须是应该执行此检查的 API。否则 API 将盲目接受某些恶意客户端可能发送的 token 。将此实现到 API 端,如果访问 token 无效,请发送 401 - 未经授权的响应。
关于.net - 用于桌面应用程序的受 OpenID Connect 保护的 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51585132/