ASP.NET Core 中的 Google 外部登录设置
作者:Valeriy Novytskyy, Rick Anderson 和 Sharaf Abacery
本教程演示如何使用之前页面中创建的 ASP.NET Core 项目使用户能够使用他们的 Google 帐户进行登录。
创建 Google OAuth 2.0 客户端 ID 和机密
遵循 指南,将 Google Sign-In 集成到您的 Web 应用(Google 文档中)。
前往 Google API 和服务。
必须存在一个项目,否则,你可能需要先创建一个项目。 选择项目后,进入仪表板。
在仪表板的 OAuth 同意屏幕中:
- 在“User Type”部分中选择“外部”,然后选择“创建”。
- 在 应用信息 对话框中,为应用提供 应用名称、用户支持电子邮件,以及 开发人员联系信息。
- 完成“范围”步骤。
- 完成“测试用户”步骤。
- 查看 OAuth 同意屏幕,然后返回到应用 仪表板。
在应用程序仪表板的 凭据 选项卡中,选择 创建凭据>OAuth 客户端 ID。
选择 应用程序类型>Web 应用程序,选择 名称。
在 授权重定向 URI 部分中,选择 添加 URI 以设置重定向 URI。 重定向 URI 示例:
https://localhost:{PORT}/signin-google
,其中{PORT}
占位符是应用的端口。选择“创建”按钮。
保存 客户端 ID,并 客户端密码,以便在应用的配置中使用。
部署站点时,可以:
- 在 Google 控制台中将应用的重定向 URI 更新为应用的已部署重定向 URI。
- 在 Google 控制台中使用生产应用的生产重定向 URI 为此应用创建新的 Google API 注册。
存储 Google 客户端 ID 和机密
使用 机密管理器存储敏感设置,例如 Google 客户端 ID 和机密值。 对于此示例,请使用以下步骤:
按照启用机密存储中的说明初始化项目以启用机密存储。
使用密钥
Authentication:Google:ClientId
和Authentication:Google:ClientSecret
将敏感设置存储在本地机密存储中:dotnet user-secrets set "Authentication:Google:ClientId" "<client-id>" dotnet user-secrets set "Authentication:Google:ClientSecret" "<client-secret>"
:
分隔符不适用于所有平台上的环境变量分层键。 例如,Bash不支持 :
分隔符。 __
(双下划线):
- 所有平台都支持。
- 自动替换为冒号,即
:
。
可以在 API 控制台中管理 API 凭据和使用情况。
配置 Google 身份验证
- 将
Google.Apis.Auth.AspNetCore3
NuGet 包添加到应用。 - 将身份验证服务添加到
program.cs
: - 关注
Add Authentication for asp.net app
调用 AddIdentity 配置默认方案设置。 AddAuthentication(IServiceCollection, String) 重载设置 DefaultScheme 属性。 AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) 重载允许配置身份验证选项,这些选项可用于为不同的目的设置默认身份验证方案。 对 AddAuthentication
的后续调用将替代以前配置的 AuthenticationOptions 属性。
注册身份验证处理程序的 AuthenticationBuilder 扩展方法只能在每个身份验证方案中调用一次。 存在允许配置方案属性、方案名称和显示名称的重载。
使用 Google 登录
- 在 Google 开发人员库中获取指向库的链接。
- 然后转到 Google 开发人员按钮生成器。
- 设置控制器以匹配
data-login_uri="{HostName}/{ControllerName}/{actionName}"
属性,因为它会在成功登录后将你转发到该链接。 - 创建一个控制器和一个动作,该动作接受一个参数
string credential
,该参数是在完成登录过程后由 Google 返回的。 - 使用以下代码行验证
credential
:GoogleJsonWebSignature.Payload payload = await GoogleJsonWebSignature.ValidateAsync(credential);
- 这将检索有关已登录用户的可用信息,然后可以将这些信息存储在数据库中。
更改默认回叫 URI
URI 段 /signin-google
被设置为 Google 身份验证提供程序的默认回调函数。 配置 Google 身份验证中间件时,可以通过继承的 GoogleOptions 类的 RemoteAuthenticationOptions.CallbackPath 属性更改默认回调 URI。
故障 排除
- 如果登录不起作用且未收到任何错误,请切换到开发模式,使问题更易于调试。
- 如果未通过在
ConfigureServices
中调用services.AddIdentity
来配置 Identity,则尝试进行身份验证将导致“ArgumentException: 必须提供‘SignInScheme’选项”异常。 本教程中使用的项目模板可以确保 Identity 已配置好。 - 如果尚未通过应用初始迁移来创建站点数据库,则会出现在处理请求时发生数据库操作失败 错误。 选择“应用迁移”以创建数据库,然后刷新页面来绕过错误以继续。
- 成功验证 OAuth 2.0 提供程序(如 Google)的请求后出现 HTTP 500 错误:请参阅 此 GitHub 问题。
- 如何通过 Google for React 和其他 SPA 应用实现外部身份验证:请参阅 此 GitHub 问题。
后续步骤
- 本文介绍了如何使用 Google 进行身份验证。 可以按照类似的方法向上一页中列出的其他提供程序进行身份验证。
- 将应用发布到 Azure 后,在 Google API 控制台中重置
ClientSecret
。 - 在 Azure 门户中将
Authentication:Google:ClientId
和Authentication:Google:ClientSecret
设置为应用程序设置。 配置系统设置为从环境变量读取密钥。