【问题标题】:OAuth User-Agent Flow with C# Desktop App使用 C# 桌面应用程序的 OAuth 用户代理流程
【发布时间】:2012-06-05 19:10:18
【问题描述】:

我目前正在尝试将 OAuth 2.0 用户代理流程与客户端 C# 应用程序一起使用,但我遇到了一些与重定向 URI 相关的困惑。

因为我正在使用客户端应用程序,所以我无法向 Web 服务器提供标准重定向 URL。但是,根据我尝试进行身份验证的人员(在本例中为 Salesforce),用户代理流程是用于客户端应用程序的正确流程。

我的问题是,在这种情况下我该怎么做才能捕获访问令牌?显然我可以创建一个“客户端可访问的本地资源”,但我不熟悉这背后的机制,而且我找不到关于该主题的任何资源(部分原因是我不知道该寻找什么)。

任何关于我应该从哪里开始寻找的指针将不胜感激。


编辑:更多挖掘揭示了以下stackoverflow问题:

How do I develop against OAuth locally?

我正在对他们的建议进行更多调查,但任何其他建议也很好。


编辑:更多搜索显示这篇文章:

http://sarangasl.blogspot.com/2010/09/create-simple-web-service-in-visual.html

仍然觉得我在黑暗中四处闲逛,不了解大局,但我相信我需要使用 localhost 设置本地 Web 服务并将我的重定向 URI 指向那里。然后,我将使用我的 Web 服务来解开来自 OAuth 服务器的响应,并让我的应用程序做出适当的响应。更多更新即将到来。


哎呀。因此,根据我收集到的信息,我需要设置一个本地 Web 服务作为 OAuth 的回调。我需要自己收听所述网络服务并捕获回调以将其传递给我的应用程序。但是VS2010默认提供的ASP.NET Web服务不支持URL参数,只支持API调用,所以我显然需要改用WCF Rest starter kit。

我对这一切完全陌生,所以在这一点上任何提示都是天赐之物。一般来说,我想我设置了一个本地 WCF Rest 服务,将该本地 URI 作为回调提供给 OAuth,然后使用 Rest 服务捕获回调 URL。然后我解析 URL 并提取访问令牌。此时,我的应用程序是否请求访问令牌,或者我的 Web 服务是否可以将令牌“提供”给我的应用程序?即,控制点应该在哪里?

【问题讨论】:

    标签: c# authentication oauth oauth-2.0


    【解决方案1】:

    想出了一个聪明的方法来解决这个问题。我没有设置一个服务来监听 OAuth 的重定向 URL,而是在我的 Windows 表单中嵌入了一个 WebBrowser 控件。

    我将此嵌入式 WebBrowser 指向身份验证 URL,让用户登录并使用 Salesforce 进行身份验证,并授予我的应用程序权限。然后,我让 Salesforce 将我的嵌入式浏览器重定向到我提供的虚拟重定向 URL。这个重定向实际上永远不会去任何地方,它只是显示为 404。

    但是,通过监控 WebBrowser.Url,我可以获取我的嵌入式 WebBrowser 控件指向的整个 URL,包括 Salesforce 附加的访问令牌。基本上,在用户验证并授予权限后,嵌入式浏览器被重定向到“http://www.dummyurl.com”。 Salesforce 会附加访问令牌,因此 WebBrowser.Url 最终看起来像这样:

    http://www.dummyurl.com#access_token=ABCDEF&instance_url=ABCDEF

    从这里,我可以解析 URL 并继续我的方式。无需第三方网络服务器或本地网络服务。 :)

    【讨论】:

    • 这是一个选项。但要小心:用户可以在您的 WebBrowser 上使用一些技巧,例如在浏览器历史记录中前进和后退、页面刷新、超时、网络中断。您将不得不处理所有 HTTP 错误代码 + 所有嵌入式浏览器讨厌的技巧。祝你好运:)
    • 另外考虑您的应用程序的 UI,它可能与 Salesforce 建议的 UI 不同 - 您无法更改其默认设置,因为您无法控制它。
    • 呃,你是对的。接下来我将不得不看一下嵌入式浏览器的安全性。就 UI 而言,我的应用程序是一个后台进程,会在某些事件上生成弹出窗口,因此每次应用程序启动只需要一次身份验证(通常每天早上一次)。不过感谢您的提示,我忘记了嵌入式 IE 实例可能会打开的安全漏洞。
    【解决方案2】:

    调用你需要的Authonomous Client http://wiki.developerforce.com/page/Digging_Deeper_into_OAuth_2.0_on_Force.com#Obtaining_a_Token_in_an_Autonomous_Client_.28Username-Password_Flow.29的授权类型。阅读您必须发送到那里的 URL。

    grant_type=password&client_id=<your_client_id>&client_secret=<your_client_secret>&username=<your_username>&password=<your_password>
    

    【讨论】:

    • 很遗憾,我无法使用该流程。如果尝试验证的 IP 未列入白名单,则密码必须附加用户的安全令牌,这不是我的应用程序的选项。
    • 把它放在你的代理上,它会被列入白名单。加上链接是POSTed - 所以请求参数将通过 HTTPS 加密。你对这种方法有什么问题吗?
    • 嗯,我没想过代理它。但是,我正在为其他业务环境中的其他用户开发此应用程序,并且无法通过第三方代理路由所有流量。我也无法控制用户不同组织的白名单。最后,API 开发人员明确告诉我要避免使用用户密码 OAuth 流程。不过,我个人对此没有任何问题,但请查看我的其他答案,让我知道您对此有何看法。 :)
    • 您可以为用户提供安全令牌 - 在这种情况下,您不必将他们的 IP 放入白名单。重读 Doc about Autonomous Client 的最后一部分。
    • 我重新阅读了文档,但没有找到您所指的内容 - 用户应该是唯一能够生成自己的安全令牌的人,我不能为他们这样做。尽管如此,根据 Salesforce API 人员的说法,用户密码流是邪恶的和坏的。 :P
    【解决方案3】:

    您可以使用 DotNetOpenAuth 库。有一个使用 WPF 的示例,它使用由 DotNetOpenAuth 库提供的名为 ClientAuthorizationView 的 winforms 控件。

    这是一个承载浏览器的控件,允许用户在不离开应用程序的情况下授权客户端。

    希望对您有所帮助。

    问候

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 2011-02-13
      • 2021-08-12
      • 2011-08-04
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      相关资源
      最近更新 更多