ASP.NET Core 中的 Google 外部登录设置
作者:Valeriy Novytskyy 和 Rick Anderson
本教程演示如何使用之前页面中创建的 ASP.NET Core 项目使用户能够使用他们的 Google 帐户进行登录。
创建 Google OAuth 2.0 客户端 ID 和机密
按照将 Google 登录功能集成到您的网络应用中(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 身份验证
将 Microsoft.AspNetCore.Authentication.Google
NuGet 包添加到应用。
将身份验证服务添加到 Startup.ConfigureServices
:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>(options =>
options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddRazorPages();
services.AddAuthentication()
.AddGoogle(options =>
{
IConfigurationSection googleAuthNSection =
Configuration.GetSection("Authentication:Google");
options.ClientId = googleAuthNSection["ClientId"];
options.ClientSecret = googleAuthNSection["ClientSecret"];
});
}
将身份验证服务添加到 Program
:
var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;
var configuration = builder.Configuration;
services.AddAuthentication().AddGoogle(googleOptions =>
{
googleOptions.ClientId = configuration["Authentication:Google:ClientId"];
googleOptions.ClientSecret = configuration["Authentication:Google:ClientSecret"];
});
对 AddIdentity 的调用将配置默认方案设置。 AddAuthentication(IServiceCollection, String) 重载设置 DefaultScheme 属性。 通过 AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) 重载可配置身份验证选项,这些选项可用于为不同的目的设置默认身份验证方案。 对 AddAuthentication
的后续调用会替代之前配置的 AuthenticationOptions 属性。
注册身份验证处理程序的 AuthenticationBuilder 扩展方法只能在每个身份验证方案中调用一次。 存在允许配置方案属性、方案名称和显示名称的重载。
登录 Google
- 运行应用并选择“登录”。 随即将显示一个使用 Google 登录的选项。
- 选择“Google”按钮后,将重定向到 Google 以进行身份验证。
- 输入你的 Google 凭据后,系统会将你重定向回网站。
使用代理或负载均衡器转发请求信息
如果应用部署在代理服务器或负载均衡器后面,则可能会将某些原始请求信息转发到请求标头中的应用。 此信息通常包括安全请求方案 (https
)、主机和客户端 IP 地址。 应用不会自动读取这些请求标头以发现和使用原始请求信息。
方案用于通过外部提供程序影响身份验证流的链接生成。 丢失安全方案 (https
) 会导致应用生成不正确且不安全的重定向 URL。
使用转发标头中间件以使应用可以使用原始请求信息来进行请求处理。
有关详细信息,请参阅配置 ASP.NET Core 以使用代理服务器和负载均衡器。
多个身份验证提供程序
如果应用需要多个提供程序,请在 AddAuthentication 后面链接提供程序扩展方法:
services.AddAuthentication()
.AddMicrosoftAccount(microsoftOptions => { ... })
.AddGoogle(googleOptions => { ... })
.AddTwitter(twitterOptions => { ... })
.AddFacebook(facebookOptions => { ... });
有关 Google 身份验证支持的配置选项的详细信息,请参阅 GoogleOptions API 参考。 这可用于请求有关用户的各种信息。
更改默认回叫 URI
URI 段 /signin-google
设为 Google 身份验证提供程序的默认回叫。 你可以更改默认回叫 URI,同时通过 GoogleOptions 类的继承的 RemoteAuthenticationOptions.CallbackPath 属性配置 Google 身份验证中间件。
疑难解答
- 如果登录不起作用,但没有收到任何错误,请切换到开发模式,从而更轻松地对问题进行调试。
- 如果未通过在
ConfigureServices
中调用services.AddIdentity
来配置 Identity,则尝试进行身份验证将导致“ArgumentException: 必须提供‘SignInScheme’选项”异常。 本教程中使用的项目模板可确保已配置 Identity。 - 如果未通过应用初始迁移来创建站点数据库,则将出现“处理请求时数据库操作失败”的错误。 选择“应用迁移”以创建数据库,然后刷新页面来绕过错误以继续。
- 成功验证 OAuth 2.0 提供程序(如 Google)的请求后出现 HTTP 500 错误:请参阅 此 GitHub 问题。
- 如何通过 Google 为 React 和其他 SPA 应用实现外部身份验证:请参阅此 GitHub 问题。
后续步骤
- 本文介绍了如何使用 Google 进行身份验证。 可以按照类似的方法使用之前页面中列出的其他提供程序进行身份验证。
- 在将应用发布到 Azure 后,请在 Google API 控制台中重置
ClientSecret
。 - 在 Azure 门户中将
Authentication:Google:ClientId
和Authentication:Google:ClientSecret
设置为应用程序设置。 配置系统设置为从环境变量读取密钥。