使用 ASP.NET Core 设置 Twitter 外部登录

作者:Valeriy NovytskyyRick Anderson

此示例演示如何使用之前页面中创建的示例 ASP.NET Core 项目使用户能够使用他们的 Twitter 帐户进行登录

注意

下述 Microsoft.AspNetCore.Authentication.Twitter 包使用了 Twitter 提供的 OAuth 1.0 API。 此后,Twitter 添加了具有一组不同功能的 OAuth 2.0 API。 OpenIddictAspNet.Security.OAuth.Twitter 包是使用新 OAuth 2.0 API 的社区实现。

在 Twitter 中创建应用

  • Microsoft.AspNetCore.Authentication.Twitter NuGet 包添加到项目。

  • 导航到 Twitter 开发人员门户仪表板并登录。 如果还没有 Twitter 帐户,请使用立即注册链接创建一个帐户。

  • 如果没有项目,请创建一个项目。

  • 选择“+ 添加应用”。 填写“应用名称”,然后记下生成的 API 密钥、API 密钥机密和持有者令牌。 稍后需要用到它们。

  • 在“应用设置”页中,选择“身份验证设置”部分中的“编辑”,然后:

    • 启用 3 向 OAuth
    • 从用户处请求电子邮件地址
    • 填写必填字段,然后选择“保存”

    注意

    Microsoft.AspNetCore.Identity 要求用户默认拥有电子邮件地址。 对于开发期间的回叫 URL,请使用 https://localhost:{PORT}/signin-twitter,其中 {PORT} 占位符是应用的端口。

    注意

    URI 段 /signin-twitter 设为 Twitter 身份验证提供程序的默认回叫。 你可以更改默认回叫 URI,同时通过 TwitterOptions 类的继承的 RemoteAuthenticationOptions.CallbackPath 属性配置 Twitter 身份验证中间件。

存储 Twitter 使用者 API 密钥和机密

使用机密管理器存储 Twitter 使用者 API 密钥和机密等敏感设置。 对于此示例,请执行以下步骤:

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

  2. 使用机密密钥 Authentication:Twitter:ConsumerKeyAuthentication:Twitter:ConsumerSecret 将敏感设置存储到本地机密存储:

    dotnet user-secrets set "Authentication:Twitter:ConsumerAPIKey" "<consumer-api-key>"
    dotnet user-secrets set "Authentication:Twitter:ConsumerSecret" "<consumer-secret>"
    

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

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

在创建新的 Twitter 应用程序后,可以在“密钥和访问令牌”选项卡中找到这些令牌:

配置 Twitter 身份验证

将身份验证服务添加到 Startup.ConfigureServices

{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>(options =>
        options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();

    services.AddAuthentication().AddTwitter(twitterOptions =>
    {
        twitterOptions.ConsumerKey = Configuration["Authentication:Twitter:ConsumerAPIKey"];
        twitterOptions.ConsumerSecret = Configuration["Authentication:Twitter:ConsumerSecret"];
        twitterOptions.RetrieveUserDetails = true;
    });

}
var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;
var configuration = builder.Configuration;

services.AddAuthentication().AddTwitter(twitterOptions =>
    {
        twitterOptions.ConsumerKey = configuration["Authentication:Twitter:ConsumerAPIKey"];
        twitterOptions.ConsumerSecret = configuration["Authentication:Twitter:ConsumerSecret"];
    });

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

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

多个身份验证提供程序

如果应用需要多个提供程序,请在 AddAuthentication 后面链接提供程序扩展方法:

services.AddAuthentication()
    .AddMicrosoftAccount(microsoftOptions => { ... })
    .AddGoogle(googleOptions => { ... })
    .AddTwitter(twitterOptions => { ... })
    .AddFacebook(facebookOptions => { ... });

有关 Twitter 身份验证支持的配置选项的详细信息,请参阅 TwitterOptions API 参考。 这可用于请求有关用户的各种信息。

使用 Twitter 登录

运行应用并选择“登录”。 随即将显示一个使用 Twitter 登录的选项:

选择“Twitter”将重定向到 Twitter 以进行身份验证:

输入你的 Twitter 凭据后,系统会将你重定向回可以在其中设置你的电子邮件的网站。

现在,你已使用你的 Twitter 凭据成功登录了:

使用代理或负载均衡器转发请求信息

如果应用部署在代理服务器或负载均衡器后面,则可能会将某些原始请求信息转发到请求标头中的应用。 此信息通常包括安全请求方案 (https)、主机和客户端 IP 地址。 应用不会自动读取这些请求标头以发现和使用原始请求信息。

方案用于通过外部提供程序影响身份验证流的链接生成。 丢失安全方案 (https) 会导致应用生成不正确且不安全的重定向 URL。

使用转发标头中间件以使应用可以使用原始请求信息来进行请求处理。

有关详细信息,请参阅配置 ASP.NET Core 以使用代理服务器和负载均衡器

疑难解答

  • 仅限 ASP.NET Core 2.x:如果未通过在 ConfigureServices 中调用 services.AddIdentity 来配置 Identity,则尝试进行身份验证将导致“ArgumentException: 必须提供‘SignInScheme’选项”异常。 此示例中使用的项目模板可确保已配置 Identity。
  • 如果未通过应用初始迁移来创建站点数据库,则将出现“处理请求时数据库操作失败”的错误。 点击“应用迁移”,创建数据库并刷新以绕过错误继续操作。

后续步骤

  • 本文介绍了如何使用 Twitter 进行身份验证。 可以按照类似的方法使用之前页面中列出的其他提供程序进行身份验证。

  • 在将你的网站发布到 Azure Web 应用后,你应该在 Twitter 开发人员门户中重置 ConsumerSecret

  • 在 Azure 门户中将 Authentication:Twitter:ConsumerKeyAuthentication:Twitter:ConsumerSecret 设置为应用程序设置。 配置系统设置为从环境变量读取密钥。