【问题标题】:How should I implement OAuth for an application? [closed]我应该如何为应用程序实施 OAuth? [关闭]
【发布时间】:2013-03-24 02:49:31
【问题描述】:

我正在为需要执行以下操作的客户创建应用程序:

  • 允许用户使用 Google、Facebook、Twitter 和 LinkedIn 进行身份验证。
  • 允许用户在注册后添加其他提供商。 (即,如果用户通过 Google 进行了身份验证,那么他们也应该能够添加任何或所有其他提供商。)
  • 允许用户导入 Google 联系人、Facebook 好友列表、Twitter 关注者和 Linkedin 好友,以构建自定义联系人列表。

从哪里开始学习这方面的最佳起点? .NET 中是否有每个人都使用这些东西的标准?我已经在谷歌上搜索了几个小时,虽然大多数人似乎都指向DotNetOpenAuth,但我似乎找不到任何关于如何使用该库的可靠教程。下载带有示例,但我仍然感到困惑。

我认为它会很简单:

  • 配置提供者的秘密。
  • 开始使用提供商登录
  • 使用身份验证 cookie 对用户进行身份验证
  • 在我的数据库中创建用户记录并存储来自提供商的唯一 ID。

但似乎每个提供商都有自己的一组代码,而且这一切都如此不同和令人困惑。 Facebook 有一些图形对象,twitter 有一些我不明白的“InMemoryTokenManager”,而谷歌甚至没有身份验证示例,只有一个谷歌地址簿示例。最重要的是,出于某种原因,您必须将示例中的一些 ApplicationBlock 演示中的一些代码复制到您自己的应用程序中,并且在不知道它到底想做什么的情况下编译所有代码是一项艰巨的任务。

我觉得我在这一切中缺少一些基本的东西。

在这一点上,即使是书籍推荐也会很棒。

我相信我了解 OAuth 的高级概念,但是一旦我尝试深入了解细节,我就会立即迷失方向。

【问题讨论】:

  • 不幸的是,您希望如何实现每个社交网络 API 的程度会有所不同。但是,它们中的大多数使用带有 Token 的 O'Auth 形式来实际连接。
  • 我只是希望有一些简单的 DotNetOpenAuth 教程。每个要求此类文档的 SO 问题都不可避免地被告知“下载示例,这就是您所需要的”。对于像我这样明显愚蠢的人来说,这些样本并不是“你所需要的全部”。
  • 我会查看 O'Auth 官方网站。另外,我会看一本关于 O'Auth for Social Networks 的书。

标签: c# asp.net asp.net-mvc oauth oauth-2.0


【解决方案1】:

我建议你使用 PureKrome 的 World Domination,它使用起来很简单,有据可查而且非常好用!

https://github.com/PureKrome/WorldDomination.Web.Authentication

它通过简单的一行配置处理 Twitter、Google、Facebook 等,并处理其他所有内容。

创作者也经常在 jabbr.net 上闲逛。

【讨论】:

  • 哈哈哈我喜欢自述文件。这不仅可以帮助我进行身份验证吗?我还需要在某个时候获取用户的朋友/联系人。
  • 不,它不会那样做 - afaik 这与 OAuth 无关,它将为您想要从中获取数据的每个服务定制。
  • 顺便说一句,我花了 5 分钟将 WD 连接到现有应用程序中 :) 只需将令牌存储在链接到用户帐户的表中(我存储提供程序名称、令牌,然后存储来自提供程序的原始返回同样,您永远不知道何时需要它...)并手动设置 asp.net Auth 令牌 cookie。
  • 我一定会仔细看看这个。也许如果我用像这样简单的东西来标准化身份验证,那么我可以为每个提供者的 API 的其余部分滚动我自己的包装器,因为无论如何它们都是如此不同。我讨厌重新发明轮子,但似乎编写自己的包装器可能是最好的学习方式。
【解决方案2】:

ASP.NET MVC 4 'Internet Application' 模板已经实现了DotNetOpenAuth,如果你还没有的话,你应该看看。

【讨论】:

  • 是的,我已经看到了。如果不与默认成员资格和角色提供程序紧密集成,我似乎找不到任何示例。此应用程序不使用它。它执行FormsAuthentication.SetAuthCookie(userId),然后使用User.Identity.Name 稍后访问userId。之后就是自定义数据模型了。
  • 那么您可能需要考虑滚动您自己的SimpleMembershipProvider 实现。
  • 想了很多。我真的一直在努力避免这种情况,但如果没有其他办法。内置功能是否可扩展?我可以添加 LinkedIn 吗?
  • 如果您已经实现了自己的 MembershipProvider,那么所有这些代码都应该直接传递给 SimpleMembershipProvder。您只需管理 OAuth 所需的附加表。外部身份验证实现并不特定于任何特定站点,因此添加 LinkedIn 应该非常简单。
【解决方案3】:

首先,如果您使用的是 net 4.5,其中默认的 asp.net 模板带有大多数提到的提供程序的身份验证代码,那么使用外部库确实没有意义。

其次,如果您仍然需要有关 oauth2 身份验证的一些细节的好教程,请查看 Ben Foster http://ben.onfabrik.com/posts/oauth-providers 的这篇精彩帖子

第三,不幸的是,如果您需要身份验证以外的任何其他内容,则没有单一协议。因此,每个提供者都有自己的方式来公开这些额外的数据——联系人、帖子等。你不能做太多事情,它与 oauth2 无关,而只是一种调用特定 api 的方式,而这种方式通常是偶然的暴露为基于 oauth2 身份验证的 rest/xml Web 服务。这意味着如果您只进行身份验证,则每个提供商的协议基本相同。更多的是具体的。

第四,我会坚持使用提供商返回的电子邮件地址,而不是内部 ID。并非所有提供商都支持该 ID,而所有提供商都可以返回用户电子邮件。您可以信任这些信息,因为提供商会在电子邮件通过 oauth2 返回之前对其进行验证。

【讨论】:

  • Twitter 似乎没有返回电子邮件,而且似乎没有向用户询问的选项。
  • @AlexFord:感谢您的评论。我总是对 google/facebook/live 进行 oauth2,而 twitter 缺少电子邮件对我来说是新事物。认为我的最后一句话无效,但其他人持有。
【解决方案4】:

看看 Social Bootstrap API 项目(它使用 servicestack,但很高兴看到所有这些流行语技术在一个可读的示例中协同工作)。

另外,如果您想更好地了解 OAuth 的工作原理,Mashape has good explanation。这将使您了解大多数包装器实现的幕后内容。

Rick Strahl has an example 几年前我用它在 MVC 中实现 OpenID。它有点过时了,但它是当时最直接的实现之一。我使用该实现构建的几个客户站点仍然运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2016-09-17
    相关资源
    最近更新 更多