0

预计到达时间 2:

我能够使用公开可用的文档和我的 SO 广泛的密码学知识以及 MSDN 上处理 OAuth2 实现的最重要部分的一个方便的代码示例来弄清楚所有这些 - 验证签名 JWT 的完整性。

我在我的博客上详细介绍了一个由三部分组成的系列。

关键组件是验证来自您的 OAuth2 提供商的 JWT 响应的完整性 - 由于对加密功能的理解不足,许多开发人员未能正确实现这一点,这就是为什么来自各种提供商(包括 Google)的公共文档建议使用预先存在的库来处理身份验证。

问题是 DotNetOpenAuth多年来没有更新,我不建议使用老化的库进行身份验证,因为不知道哪些安全漏洞可能仍未修补。

C# 中的验证组件使用 RSAPKCS1SignatureDeformatter.VerifySignature,MSDN 文章中有关此方法的示例代码几乎是您需要使用的示例代码,以确保签名的 JWT 有效且未被恶意第三方拦截派对。

预计到达时间:

由于 Google 使用 google-oauth2 标记专门将用户引导至 Stack Overflow,以获取有关 Google 的 OAuth2 API 的问题、帮助和支持,因此我将其发布在 Stack Overflow 上。2013 年 3 月实施了对所有 Google OAuth2 支持的 Stack Overflow 迁移,如本公告所示:

https://groups.google.com/forum/#!forum/oauth2-dev

设想:

具有第三方用户登录的新 ASP.NET C# 应用程序。我首先实现了 Google OAuth2,然后将转向其他服务(Facebook、通用 OpenID 等)。我知道有 C# 的现有库,但我想尽可能避免使用第三方库。

在长时间阅读 Google 的 OAuth2 文档并弄清楚 JWT 规范之后,我已经走得很远了。但是,我试图确保我理解用户允许我的应用程序使用他们的帐户后谷歌返回的 Base64 编码 JWT 的第三段。

前两段只是 Base64 编码的明文。得到那么多;这很容易用 JavaScriptSerializer 解码和解析。我坚持的是第三部分,据我所知,它需要用于验证 Google JWT 是否有效且不受任何恶意代码的影响。

在进入 C# 为我的应用程序编写代码之前,我一直在尝试使用 OpenSSL 对二进制 Base64 解码段进行解码,但我无法使用 Google 的公共证书解码或验证内容。

是否有关于 C# 和 Google 身份验证的体面文档?我只能找到使用 DotNetOpenAuth 或其他库的示例。

4

2 回答 2

2

如果您有 Pluralsight 帐户,Dominick Baier 有一门很棒的课程,其中有一节涵盖了这一点(在“JWT 结构和格式”部分)。他们有 10 天的免费试用期,您可以根据需要使用。

前两段只是 Base64 编码的明文。得到那么多;这很容易用 JavaScriptSerializer 解码和解析。我坚持的是第三部分,据我所知,它需要用于验证 Google JWT 是否有效且不受任何恶意代码的影响。

根据 Dominick 的说法,要获得第三段,您需要对前两个段进行 base-64 编码,用句点字符连接它们,然后运行在alg标头元素中指定的签名算法(在第一段中)。然后你将结果以 64 为基数,你就有了第三段 - 也用句号分隔。

但我应该指出,即使谷歌在主要文档中也说:

这种交互的机制要求应用程序创建 JSON Web 令牌 (JWT) 并对其进行加密签名。强烈建议开发人员使用库来执行这些任务。在不使用抽象令牌创建和签名的库的情况下编写此代码容易出错,从而严重影响应用程序的安全性。

由于 DotNetOpenAuth 已经这样做了,这可能是最好的方法。如果您正在寻找可与 DotNetOpenAuth 一起使用的 Google OAuth2 实现 - 您可以尝试我的。它已经在 Nuget 上下载了数千次,所以你并不孤单。

关于未维护 DNOA,我相信您指的是Andrew Arnott 决定辞去首席开发人员的职务。这是真的,我们祝他一切顺利。但这并不意味着根本不支持或维护 DNOA。这只是意味着它得到了社区的支持,而不是个人或公司。您应该能够在 StackOverflow 或DNOA Google Group上继续获得帮助和支持。

于 2013-08-21T23:14:59.893 回答
0

遵循主要的 OAuth 2 文档: https ://developers.google.com/accounts/docs/OAuth2

如果您需要好的示例,请尝试查找 Java 示例,它们可能会有所帮助,因为这些语言相对接近。

于 2013-08-21T22:47:25.453 回答