【问题标题】:How can I use Salesforce OAuth 2.0 implicit flow authentication in a WinForms application?如何在 WinForms 应用程序中使用 Salesforce OAuth 2.0 隐式流验证?
【发布时间】:2020-08-31 02:34:42
【问题描述】:

我编写了一个使用 OAuth 2.0 网络服务器流连接到 Salesforce API 的网络应用程序,一切正常。

但是现在需要从 WinForms 桌面应用程序访问 Salesforce API,我被卡住了。 Salesforce 建议对桌面应用程序使用用户代理或隐含流程。

Salesforce 在此处描述流程 - https://help.salesforce.com/articleView?id=remoteaccess_oauth_user_agent_flow.htm&type=5

我创建了一个 WinForms 应用程序并使用 CefSharp 库来嵌入浏览器。我可以使用文章中显示的 URL 语法在嵌入式浏览器中打开网页,例如

https://login.salesforce.com/services/oauth2/authorize?response_type=token& client_id=CLIENT_ID&redirect_uri=REDIRECT_URI

但我不知道从这里去哪里。

我猜重定向 URI 必须是公共端点,但是 Salesforce 返回到 URI 的令牌如何找到它返回到我的桌面应用程序的方式,以便可以在 WebRequests 的标头中使用它来访问 API .

我将不胜感激任何帮助、指针、示例代码等。

谢谢。

【问题讨论】:

    标签: c# winforms authentication oauth-2.0 salesforce


    【解决方案1】:

    正如eyescream's answer 解释的那样,Webserver flow 存在安全问题,因为监听该端口的任何恶意软件也可以访问安全令牌。

    因此,我想解释一下在这种情况下如何使用User-Agent flow

    1. REDIRECT_URI 设置为您信任的任何 https 端点。由于您的数据永远不会到达该端点,因此您选择哪个端点并不重要。 例如,我使用REDIRECT_URI = https:\\login.salesforce.com\,因为我确信 Salesforce 自己不会对他们自己的 API 的令牌做任何有害的事情,以防万一出现问题并且他们确实真正收到了它。 p>

    2. 由于您在应用程序中直接使用浏览器 (CefSharp),因此您可以访问 URL 字符串。我不知道 CefSharp,但我确信有类似 BeforeRedirect 的事件会在实际重定向之前告诉您 URL。

    3. 在每次重定向之前,在 URL 字符串中搜索 "access_token="。如果找到该字符串,请从 URL 字符串中提取令牌并关闭浏览器。 确保在重定向之前关闭浏览器。这可确保令牌永远不会到达您在步骤 1 中选择的端点。

    【讨论】:

      【解决方案2】:

      重定向 uri 不必公开。它可以是localhost:somePort,您的应用程序必须监听该端口上的流量。

      例如,如果您想使用 SFDX CLI + Visual Studio Code 开发 SF 代码 - 有一种很好的方式来授权访问 SF 组织,您可以在网站上键入您的凭据,但当一切正常时 - OAuth 部分会发送到localhost:1717。只要没有其他东西在这个端口上监听,你就可以了。与 Salesforce Data Loader 类似 - 您可以输入用户名并传递给它,但它也有这个基于 Web 的流程。有时这是唯一的选择,如果您的 SF 管理员启用了针对 Active Directory/Google/Facebook/... 进行身份验证的单点登录 - 您可能无法使用 SF 用户名和密码。

      我的 C# 时代已经一去不复返了,但在本地机器上监听端口不应该是世界末日吗?您不应该需要与您的应用程序捆绑在一起的成熟网络服务器...

      https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-implicit-grant-flow 有一些很好的理论

      https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.tcplistener?redirectedfrom=MSDN&view=netcore-3.1 示例代码?

      【讨论】:

        猜你喜欢
        • 2018-10-04
        • 2018-11-29
        • 2014-04-15
        • 2016-08-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-02
        • 1970-01-01
        • 2016-09-06
        相关资源
        最近更新 更多