ASP.NET Core 中的 Google 外部登录设置

作者:Valeriy Novytskyy, Rick AndersonSharaf 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 和机密值。 对于此示例,请使用以下步骤:

  1. 按照启用机密存储中的说明初始化项目以启用机密存储。

  2. 使用密钥 Authentication:Google:ClientIdAuthentication:Google:ClientSecret将敏感设置存储在本地机密存储中:

    dotnet user-secrets set "Authentication:Google:ClientId" "<client-id>"
    dotnet user-secrets set "Authentication:Google:ClientSecret" "<client-secret>"
    

: 分隔符不适用于所有平台上的环境变量分层键。 例如,Bash不支持 : 分隔符。 __(双下划线):

  • 所有平台都支持。
  • 自动替换为冒号,即 :

可以在 API 控制台中管理 API 凭据和使用情况。

配置 Google 身份验证

调用 AddIdentity 配置默认方案设置。 AddAuthentication(IServiceCollection, String) 重载设置 DefaultScheme 属性。 AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) 重载允许配置身份验证选项,这些选项可用于为不同的目的设置默认身份验证方案。 对 AddAuthentication 的后续调用将替代以前配置的 AuthenticationOptions 属性。

注册身份验证处理程序的 AuthenticationBuilder 扩展方法只能在每个身份验证方案中调用一次。 存在允许配置方案属性、方案名称和显示名称的重载。

使用 Google 登录

  • Google 开发人员库中获取指向库的链接。
  • 然后转到 Google 开发人员按钮生成器
  • 设置控制器以匹配 data-login_uri="{HostName}/{ControllerName}/{actionName}" 属性,因为它会在成功登录后将你转发到该链接。
  • 创建一个控制器和一个动作,该动作接受一个参数 string credential,该参数是在完成登录过程后由 Google 返回的。
  • 使用以下代码行验证 credentialGoogleJsonWebSignature.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:ClientIdAuthentication:Google:ClientSecret 设置为应用程序设置。 配置系统设置为从环境变量读取密钥。