.net - 用于桌面应用程序的受 OpenID Connect 保护的 API

标签 .net native openid openid-connect

我正在构建一个将连接到 API 的 WPF .NET Windows 应用程序。因为我们还有其他 API,所以我想开始将所有登录逻辑放入以标准化方式处理它的单个模块/服务中。我认为 OpenID Connect (OIDC) 是一个很好的协议(protocol)。

据我所知,使用 PKCE 的授权代码流是这里的方法。如果我以正确的方式进行此操作,我希望有人为我确认。以下是我想我需要实现的流程:

  • 用户启动应用程序并通过嵌入式浏览器登录到我们的 OIDC 提供商(使用 PKCE 流程通过代码)。客户端是我们的原生应用程序,范围仅限于 'profile' 'the-api'。
  • 用户登录后,使用应用程序可以拦截的 POST 重定向返回刷新 token 和访问 token 。
  • native 应用程序使用该访问 token 来获取用户信息并在应用程序中显示配置文件信息。
  • native 应用程序使用 access_token 向 API 发送请求。
  • 该 api 通过检查 OP 的 userinfo 端点的 access_token 并确保它具有正确的范围来验证用户。

  • 我认为 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/

    相关文章:

    c# - 在 Blazor 服务器端应用程序中获取用户代理和 IP

    c# - 如何在 Windows 8 上修复 .NET Framework 4.0?

    reactjs - 从 React Native 中的 api 拦截器(组件外部)重定向到屏幕

    hadoop - mahout 在 hadoop 上的 kmeans 聚类错误

    允许 facebook/openid/twitter 等的 PHP OpenID 库;

    c# - 无法在 C# 应用程序中为我的线程使用多个处理器组

    c# - 反编译.Net代码: lambda expressions

    ruby-on-rails - 如何使用 ruby​​ on rails 构建 openid 提供程序

    java - Android Activity销毁时如何销毁Native进程

    c# - 如何在 IdentityServer4 中向访问 token 添加自定义声明?