使用 ASP.NET Core 設定的 Twitter 外部登入
作者:Valeriy Novytskyy 和 Rick Anderson
此範例示範如何使用在上一頁建立的範例 ASP.NET Core 專案,讓使用者能使用其 Twitter 帳戶登入。
注意
下面所述的 Microsoft.AspNetCore.Authentication.Twitter 套件會使用 Twitter 所提供的 OAuth 1.0 API。 此後,Twitter 新增了 OAuth 2.0 API 與一組不同的功能。 OpenIddict 和 AspNet.Security.OAuth.Twitter 套件是使用新 OAuth 2.0 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 金鑰和秘密。 針對此範例,使用下列步驟:
依照啟用秘密儲存體的指示,初始化秘密儲存體的專案。
使用秘密金鑰
Authentication:Twitter:ConsumerKey
和Authentication: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:ConsumerKey
和Authentication:Twitter:ConsumerSecret
設定為應用程式設定。 設定系統已設為從環境變數讀取金鑰。