如何在使用 JWT 的 asp.net 核心 web 应用和 web api 中使用谷歌身份验证

Posted

技术标签:

【中文标题】如何在使用 JWT 的 asp.net 核心 web 应用和 web api 中使用谷歌身份验证【英文标题】:How to use google authencticaion in asp.net core web app and web api that uses JWT 【发布时间】:2019-11-16 00:33:19 【问题描述】:

我正在使用 asp.net core 2.2 开发一个 Web 应用程序。 Web API 服务于来自 Web 应用程序的每个请求。我在 Web API 中使用 JWT 令牌身份验证。该令牌会出现在来自 Web 应用程序的每个请求中。

Web APP -----> Web API ----> 数据层----> EF Core ---->DB

在登录时,用户在网页界面上输入电子邮件和密码,然后点击登录按钮。请求转到 Web API,而不是从所有其他层传递到 DB。如果用户有效,则在 Web API 中生成一个令牌并将其传递给 Web App 的响应。现在,在从 Web App 到 Web API 的每个进一步请求中,Web-APP 在标头中发送此令牌。

现在,我想添加一个外部身份验证提供程序,例如 Google。问题是我不确定如何处理我的应用程序流程?因为 Google Authentication 只针对 Web 应用,不会影响 Web API 的功能。

有什么建议吗?

【问题讨论】:

【参考方案1】:

您需要做的是将用户身份验证委托给外部身份提供者 (IdP)。在登录屏幕中,您通常允许用户在使用电子邮件/密码或外部 IdP(例如 Google、Facebook 等)之间进行选择。如果用户选择后者,“身份验证”步骤将由 IdP 处理,然后将 HTTP 重定向到您(到您定义的 URL)以及经过数字签名并包含一些用户信息(姓名)的 ID 令牌,电子邮件,...)

在这种情况下,应用程序流程的变化如下:

Web APP -----> Web API ----> Data Layer----> EF Core ---->DB

   | ^
   v |

Identity Provider (e.g. Google)

请注意,往返 IdP 的重定向通常基于 HTTP 重定向。在简单的名义情况下,您不需要从 Web API 层调用 IdP,尽管您必须将每个受支持的 IdP 定义为 ID 令牌的受信任颁发者(签名验证所需)

分步说明通常由 IdP 提供,r.f. Google Sign-In 和 Facebook login

【讨论】:

【参考方案2】:

我建议您使用身份服务器 4 作为您的身份提供者。

您的 web api 将是受身份服务器保护的资源。在您的客户端应用程序中,当启动身份验证过程时,根据身份验证流程,用户将被重定向到身份服务器进行身份验证,用户可以选择本地数据库用户登录或通过谷歌身份验证外部登录。如果用户选择 local db ,用户将在身份服务器的登录页面上输入他的凭据并验证本地数据库中的凭据。如果凭据正确,则身份服务器将发出令牌并使用令牌重定向回客户端应用程序。如果用户选择外部登录,用户将被重定向到谷歌的登录页面进行登录,身份服务器将从谷歌重定向后发出令牌(从谷歌发出的令牌中获取声明)并使用令牌重定向回客户端应用程序。

在认证流程中,客户端可以设置他要访问的api资源,在用户同意访问api资源(你的web api)的权限后,颁发的访问令牌就可以用来访问你的web api。

身份服务器文档:http://docs.identityserver.io/en/latest &Code samples.

【讨论】:

以上是关于如何在使用 JWT 的 asp.net 核心 web 应用和 web api 中使用谷歌身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 JWT 令牌保护 asp.net 核心 Web api 时如何从 Azure AD 获取用户

JWT:如何从声明中的特定键获取值列表。 C# Asp.Net 核心

如何在 JWT 中包含身份角色声明?

如何将 JWT 用于 asp.net Core

asp.net 核心中的 jwt 令牌无效

JWT 和 asp.net(核心)Web 应用程序