作者:Valeriy Novytskyy 和 Rick Anderson
本教程包含代码示例演示如何让用户使用在 上一页上创建的示例 ASP.NET Core 项目使用其 Facebook 帐户登录。 首先,按照 官方步骤创建 Facebook 应用 ID。
在 Facebook 中创建应用
- 将 Microsoft.AspNetCore.Authentication.Facebook NuGet 包添加到项目。 
- 导航到 Facebook 开发人员应用 页面并登录。 如果还没有 Facebook 帐户,请使用登录页上 的“注册 Facebook ”链接创建一个。 拥有 Facebook 帐户后,请按照说明注册为 Facebook 开发人员。 
- 从 “我的应用 ”菜单中选择“ 创建应用”。 此时会显示 “创建应用 ”窗体。  
- 选择最适合你的项目的应用类型。 对于此项目,请选择 “使用者”,然后选择 “下一步”。 将创建新的应用 ID。 
- 填写表单,然后点击“ 创建应用 ”按钮。  
- 在“将产品添加到应用”页中,选择“Facebook 登录”卡片上的“设置”。  
- 快速入门向导启动时将“选择平台”作为第一个页面。 单击左下角菜单中的 FaceBook 登录设置 链接,暂时绕过向导:  
- 将显示 “客户端 OAuth 设置” 页:  
- 在 “有效 OAuth 重定向 URI” 字段中输入开发 URI,并追加 /signin-facebook(例如: - https://localhost:44320/signin-facebook)。 本教程稍后配置的 Facebook 身份验证将自动处理 /signin-facebook 路由上的请求以实现 OAuth 流。
注释
URI /signin-facebook 设置为 Facebook 身份验证提供程序的默认回调地址。 你可以更改默认回叫 URI,同时通过 FacebookOptions 类的继承 RemoteAuthenticationOptions.CallbackPath 属性配置 Facebook 身份验证中间件。
- 选择保存更改。 
- 在左侧导航中选择“设置基本”>链接。 
- 记下你的 - App ID和- App Secret。 在下一部分中,您将把两者添加到 ASP.NET Core 应用程序中。
- 部署站点时,需要重新访问 Facebook 登录 设置页并注册新的公共 URI。 
存储 Facebook 应用 ID 和机密
使用 机密管理器存储敏感设置,例如 Facebook 应用 ID 和机密值。 对于此示例,请使用以下步骤:
- 按照启用机密存储中的说明初始化项目以启用机密存储。 
- 使用密钥 - Authentication:Facebook:AppId和- Authentication:Facebook:AppSecret将敏感设置存储在本地机密存储中:- dotnet user-secrets set "Authentication:Facebook:AppId" "<app-id>" dotnet user-secrets set "Authentication:Facebook:AppSecret" "<app-secret>"
: 分隔符不适用于所有平台上的环境变量分层键。 例如,: 不支持  分隔符。 __(双下划线):
- 所有平台都支持。
- 自动替换为冒号,即 :。
配置 Facebook 身份验证
将身份验证服务添加到 Startup.ConfigureServices:
services.AddAuthentication().AddFacebook(facebookOptions =>
{
    facebookOptions.AppId = Configuration["Authentication:Facebook:AppId"];
    facebookOptions.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
});
将身份验证服务添加到 Program:
var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;
var configuration = builder.Configuration;
services.AddAuthentication().AddFacebook(facebookOptions =>
    {
        facebookOptions.AppId = configuration["Authentication:Facebook:AppId"];
        facebookOptions.AppSecret = configuration["Authentication:Facebook:AppSecret"];
    });
AddAuthentication(IServiceCollection, String) 重载设置 DefaultScheme 属性。 AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) 重载允许配置身份验证选项,这些选项可用于为不同的目的设置默认身份验证方案。 对 AddAuthentication 的后续调用将替代以前配置的 AuthenticationOptions 属性。
注册身份验证处理程序的 AuthenticationBuilder 扩展方法只能在每个身份验证方案中调用一次。 存在允许配置方案属性、方案名称和显示名称的重载。
使用 Facebook 登录
- 运行应用并选择 “登录”。
- 在 “使用其他服务登录”。下,选择“Facebook”。
- 你将被重定向到 Facebook 进行身份验证。
- 输入 Facebook 凭据。
- 你将被重定向回你的网站,你可以在其中设置电子邮件。
现在,你已使用 Facebook 凭据登录:
响应取消对外部登录的授权
AccessDeniedPath 当用户未批准请求的授权需求时,可以提供用户代理的重定向路径。
以下代码将AccessDeniedPath设置为"/AccessDeniedPathInfo":
services.AddAuthentication().AddFacebook(options =>
{
    options.AppId = Configuration["Authentication:Facebook:AppId"];
    options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
    options.AccessDeniedPath = "/AccessDeniedPathInfo";
});
建议页面 AccessDeniedPath 包含以下信息:
- 远程身份验证已取消。
- 此应用需要身份验证。
- 若要再次尝试登录,请选择“登录”链接。
测试 AccessDeniedPath
- 导航到 facebook.com
- 如果已登录,则必须注销。
- 运行应用并选择 Facebook 登录。
- 选择 暂不。 你将被重定向到指定的 AccessDeniedPath页面。
使用代理或负载均衡器转发请求信息
如果应用程序部署在代理服务器或负载均衡器后面,某些原始请求信息可能会通过请求头转发到应用程序。 此信息通常包括安全请求方案 (https)、主机和客户端 IP 地址。 应用不会自动读取这些请求标头以发现和使用原始请求信息。
该方案用于生成会影响与外部提供商的身份验证流程的链接。 丢失安全方案 (https) 会导致应用生成不正确且不安全的重定向 URL。
使用转发标头中间件以使应用可以使用原始请求信息来进行请求处理。
有关详细信息,请参阅配置 ASP.NET Core 以使用代理服务器和负载均衡器。
有关 Facebook 身份验证支持的配置选项的详细信息,请参阅 FacebookOptions API 参考。 配置选项可用于:
- 请求有关用户的不同信息。
- 添加查询字符串参数以自定义登录体验。
故障排除
-               仅适用于 ASP.NET Core 2.x:如果未在 ConfigureServices中通过调用services.AddIdentity配置 Identity,则尝试进行身份验证会导致 ArgumentException:必须提供“SignInScheme”选项。 本教程中使用的项目模板可确保完成此作。
- 如果尚未通过应用初始迁移来创建站点数据库,则会出现在处理请求时发生数据库操作失败 错误。 点击 应用迁移 以创建数据库,并刷新以跳过错误继续。
后续步骤
- 本文介绍了如何使用 Facebook 进行身份验证。 可以按照类似的方法向上一页中列出的其他提供程序进行身份验证。 
- 将网站发布到 Azure Web 应用后,应在 Facebook 开发人员门户中重置 - AppSecret。
- 在 Azure 门户中将 - Authentication:Facebook:AppId和- Authentication:Facebook:AppSecret设置为应用程序设置。 配置系统设置为从环境变量读取密钥。