使用 ASP.NET Core 設定的 Twitter 外部登入

作者:Valeriy NovytskyyRick Anderson

此範例示範如何使用在上一頁建立的範例 ASP.NET Core 專案,讓使用者能使用其 Twitter 帳戶登入

注意

下面所述的 Microsoft.AspNetCore.Authentication.Twitter 套件會使用 Twitter 所提供的 OAuth 1a API。 此後,Twitter 新增了 OAuth 2 API 與一組不同的功能。 AspNet.Security.OAuth.Twitter 套件是使用新 OAuth 2 API 的社群實作。

在 Twitter 中建立應用程式

  • Microsoft.AspNetCore.Authentication.Twitter NuGet 套件新增至專案。

  • 瀏覽至 Twitter 開發人員入口網站儀表板並登入。 如果您還沒有 Twitter 帳戶,請使用 立即註冊連結加以建立。

  • 如果您沒有專案,請加以建立。

  • 選取 [+ 新增應用程式]。 填寫 [應用程式名稱],然後記錄所產生的 API 金鑰、API 金鑰秘密和持有人權杖。 稍後將需要這些資料。

  • 在 [應用程式設定] 頁面中,選取 [驗證設定] 區段中的 [編輯],然後:

    • 啟用三足式 OAuth
    • 要求使用者提供電子郵件地址
    • 填寫必要的欄位,然後選取 [儲存]

    注意

    根據預設,Microsoft.AspNetCore.Identity 要求使用者必須有電子郵件地址。 針對開發期間的回呼 URL,使用 https://localhost:{PORT}/signin-twitter,其中 {PORT} 預留位置是應用程式的連接埠。

    注意

    URI 區段 /signin-twitter 會設定為 Twitter 驗證提供者的預設回呼。 您可以在透過 TwitterOptions 類別的繼承 RemoteAuthenticationOptions.CallbackPath 屬性來設定 Twitter 驗證中介軟體時,變更預設回呼 URI。

儲存 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 認證登入:

使用 Proxy 或負載平衡器轉送要求資訊

如果將應用程式部署於 Proxy 伺服器或負載平衡器後方,可能就會在要求標頭中將一些原始要求資訊轉送到應用程式。 此資訊通常會包括安全要求配置 (https)、主機和用戶端 IP 位址。 應用程式不會自動讀取這些要求標頭來探索並使用原始要求資訊。

此配置可用於產生連結,其會對使用外部提供者的驗證流程產生影響。 遺失安全配置 (https) 會導致應用程式產生不正確且不安全的重新導向 URL。

使用轉送標頭中介軟體,使應用程式能夠使用原始要求資訊來處理要求。

如需詳細資訊,請參閱設定 ASP.NET Core 以處理 Proxy 伺服器和負載平衡器

疑難排解

  • 僅限 ASP.NET Core 2.x:如果未經由在 ConfigureServices 中呼叫 services.AddIdentity 來設定 Identity,則嘗試驗證會導致 ArgumentException:必須提供 'SignInScheme' 選項。 此範例中使用的專案範本可確保已設定 Identity。
  • 如果尚未經由套用初始移轉來建立網站資料庫,則在處理要求 錯誤時,您會發生 資料庫作業失敗。 點選 [套用移轉] 以建立資料庫並重新整理以繼續超過錯誤。

下一步

  • 本文說明如何使用 Twitter 進行驗證。 您可以遵循類似的方法來向上一頁所列的其他提供者進行驗證。

  • 將網站發佈至 Azure Web 應用程式後,您應該在 Twitter 開發人員入口網站中重設 ConsumerSecret

  • 在 Azure 入口網站中將 Authentication:Twitter:ConsumerKeyAuthentication:Twitter:ConsumerSecret 設定為應用程式設定。 設定系統已設為從環境變數讀取金鑰。