使用 ASP.NET Core 進行 Microsoft 帳戶外部登入設定
作者:Valeriy Novytskyy 和 Rick Anderson
此範例示範如何使用上一頁建立的 ASP.NET Core 6.0 專案,讓使用者使用其工作、學校或個人 Microsoft 帳戶登入。
在 Microsoft 開發人員入口網站中建立應用程式
- 將 Microsoft.AspNetCore.Authentication.MicrosoftAccount NuGet 套件新增至專案。
- 瀏覽至 Azure 入口網站 - 應用程式註冊頁面,並建立或登入 Microsoft 帳戶:
如果您沒有 Microsoft 帳戶,請選取[建立帳號]。 登入之後,系統會將您重新導向至[應用程式註冊]頁面:
- 選取[新的註冊]
- 輸入名稱。
- 選取支援帳戶類型的選項。
MicrosoftAccount
套件支援預設會支援使用「任何組織目錄中的帳戶」或「任何組織目錄中的帳戶和 Microsoft 帳戶」選項建立的應用程式進行註冊。- 若要使用其他選項,請將
MicrosoftAccountOptions
的AuthorizationEndpoint
和TokenEndpoint
成員 (用於初始化 Microsoft 帳戶驗證) 設定為建立應用程式註冊後在其[端點]頁面上顯示的 URL (按一下 [概觀]頁面上的 [端點] 即可取得)。
- 在[重新導向 URI] 下方,輸入已附加
/signin-microsoft
的開發 URL。 例如:https://localhost:5001/signin-microsoft
。 此範例稍後設定的 Microsoft 驗證配置會自動處理/signin-microsoft
路由的要求,以實作 OAuth 流程。 - 選取 [註冊]
建立用戶端密碼
- 在左窗格中,選取 [ 憑證與秘密]。
- 在[用戶端密碼]下方選取[新增用戶端密碼]
- 新增用戶端密碼的描述。
- 選取新增按鈕。
- 在[用戶端密碼]下方,複製用戶端密碼的值。
URI 區段 /signin-microsoft
設定為 Microsoft 驗證提供者的預設回呼。 透過 MicrosoftAccountOptions 類別的繼承 RemoteAuthenticationOptions.CallbackPath 屬性來設定 Microsoft 驗證中介軟體時,您可以變更預設回呼 URI。
儲存 Microsoft 用戶端識別碼和秘密
儲存敏感性設定,例如 Microsoft 應用程式(用戶端)標識碼,其位於[應用程式註冊] 的 [概觀] 頁面上,以及您在 [憑證與秘密] 頁面上建立的 [秘密] 頁面上使用秘密管理員建立的 [用戶端密碼]。 針對此範例,使用下列步驟:
依照啟用秘密儲存體的指示,初始化秘密儲存體的專案。
使用秘密金鑰
Authentication:Microsoft:ClientId
和Authentication:Microsoft:ClientSecret
,將敏感性設定儲存在本機秘密存放區中:dotnet user-secrets set "Authentication:Microsoft:ClientId" "<client-id>" dotnet user-secrets set "Authentication:Microsoft:ClientSecret" "<client-secret>"
:
分隔符號不適用於所有平台上的環境變數階層式機碼。 __
,雙底線,為:
- 所有平台都支援。 例如,Bash 不支援
:
分隔符號,但支援__
。 - 自動由
:
取代
設定 Microsoft 帳戶驗證
將驗證服務新增至 Program
:
var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;
var configuration = builder.Configuration;
services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
{
microsoftOptions.ClientId = configuration["Authentication:Microsoft:ClientId"];
microsoftOptions.ClientSecret = configuration["Authentication:Microsoft:ClientSecret"];
});
AddAuthentication(IServiceCollection, String) 多載會設定 DefaultScheme 屬性。 AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) 多載允許設定驗證選項,其可用於設定不同用途的預設驗證配置。 後續對 AddAuthentication
的呼叫會覆寫先前設定的 AuthenticationOptions 屬性。
每個驗證配置只能呼叫一次註冊驗證處理常式的 AuthenticationBuilder 擴充方法。 存在允許設定配置屬性、配置名稱和顯示名稱的多載。
如需 Microsoft 帳戶驗證支援的組態選項的詳細資訊,請參閱 MicrosoftAccountOptions API 參考。 這可用於要求使用者的不同資訊。
使用 Microsoft 帳戶登入
- 執行應用程式並選取[登入]。 隨即會出現使用 Microsoft 登入的選項。
- 選取以使用 Microsoft 登入。 系統會將您重新導向至 Microsoft 以進行驗證。 使用您的 Microsoft 帳戶登入之後,系統會提示您讓應用程式存取您的資訊:
- 選取 [是] 。 系統會將您重新導向回您可以設定電子郵件的網站。
您現在已使用您的 Microsoft 認證登入。
多個驗證提供者
當應用程式需要多個提供者時,請鏈結 AddAuthentication 背後的提供者擴充方法:
services.AddAuthentication()
.AddMicrosoftAccount(microsoftOptions => { ... })
.AddGoogle(googleOptions => { ... })
.AddTwitter(twitterOptions => { ... })
.AddFacebook(facebookOptions => { ... });
使用 Proxy 或負載平衡器轉送要求資訊
如果將應用程式部署於 Proxy 伺服器或負載平衡器後方,可能就會在要求標頭中將一些原始要求資訊轉送到應用程式。 此資訊通常會包括安全要求配置 (https
)、主機和用戶端 IP 位址。 應用程式不會自動讀取這些要求標頭來探索並使用原始要求資訊。
此配置可用於產生連結,其會對使用外部提供者的驗證流程產生影響。 遺失安全配置 (https
) 會導致應用程式產生不正確且不安全的重新導向 URL。
使用轉送標頭中介軟體,使應用程式能夠使用原始要求資訊來處理要求。
如需詳細資訊,請參閱設定 ASP.NET Core 以處理 Proxy 伺服器和負載平衡器。
疑難排解
如果 Microsoft 帳戶提供者將您重新導向至登入錯誤頁面,請記錄 Uri 中
#
(hashtag) 後面的錯誤標題和描述查詢字串參數。雖然錯誤訊息似乎表示 Microsoft 驗證有問題,但最常見的原因是您的應用程式 URI 不符合針對 Web 平台所指定的任何重新導向 URI。
如果 Identity 未透過在
ConfigureServices
中呼叫services.AddIdentity
來設定,嘗試驗證將會產生 ArgumentException:必須提供 'SignInScheme' 選項。 此範例中使用的專案範本可確保這樣做。如果尚未經由套用初始移轉來建立網站資料庫,則會收到處理要求時資料庫作業失敗錯誤。 點選[套用移轉]以建立資料庫,並重新整理以便在發生錯誤後繼續進行。
下一步
- 本文說明如何向 Microsoft 進行驗證。 您可以遵循類似的方法,向上一頁所列的其他提供者進行驗證。
- 將網站發佈至 Azure Web 應用程式之後,請在 Microsoft 開發人員入口網站中建立新的用戶端密碼。
- 在 Azure 入口網站中將
Authentication:Microsoft:ClientId
和Authentication:Microsoft:ClientSecret
設定為應用程式設定。 設定系統已設為從環境變數讀取金鑰。
此範例示範如何使用上一頁建立的 ASP.NET Core 3.0 專案,讓使用者使用其工作、學校或個人 Microsoft 帳戶登入。
在 Microsoft 開發人員入口網站中建立應用程式
- 將 Microsoft.AspNetCore.Authentication.MicrosoftAccount NuGet 套件新增至專案。
- 瀏覽至 Azure 入口網站 - 應用程式註冊頁面,並建立或登入 Microsoft 帳戶:
如果您沒有 Microsoft 帳戶,請選取[建立帳號]。 登入之後,系統會將您重新導向至[應用程式註冊]頁面:
- 選取[新的註冊]
- 輸入名稱。
- 選取支援帳戶類型的選項。
MicrosoftAccount
套件支援預設會支援使用「任何組織目錄中的帳戶」或「任何組織目錄中的帳戶和 Microsoft 帳戶」選項建立的應用程式進行註冊。- 若要使用其他選項,請將
MicrosoftAccountOptions
的AuthorizationEndpoint
和TokenEndpoint
成員 (用於初始化 Microsoft 帳戶驗證) 設定為建立應用程式註冊後在其[端點]頁面上顯示的 URL (按一下 [概觀]頁面上的 [端點] 即可取得)。
- 在[重新導向 URI] 下方,輸入已附加
/signin-microsoft
的開發 URL。 例如:https://localhost:5001/signin-microsoft
。 此範例稍後設定的 Microsoft 驗證配置會自動處理/signin-microsoft
路由的要求,以實作 OAuth 流程。 - 選取 [註冊]
建立用戶端密碼
- 在左窗格中,選取 [ 憑證與秘密]。
- 在[用戶端密碼]下方選取[新增用戶端密碼]
- 新增用戶端密碼的描述。
- 選取新增按鈕。
- 在[用戶端密碼]下方,複製用戶端密碼的值。
URI 區段 /signin-microsoft
設定為 Microsoft 驗證提供者的預設回呼。 透過 MicrosoftAccountOptions 類別的繼承 RemoteAuthenticationOptions.CallbackPath 屬性來設定 Microsoft 驗證中介軟體時,您可以變更預設回呼 URI。
儲存 Microsoft 用戶端識別碼和秘密
儲存敏感性設定,例如 Microsoft 應用程式(用戶端)標識碼,其位於[應用程式註冊] 的 [概觀] 頁面上,以及您在 [憑證與秘密] 頁面上建立的 [秘密] 頁面上使用秘密管理員建立的 [用戶端密碼]。 針對此範例,使用下列步驟:
依照啟用秘密儲存體的指示,初始化秘密儲存體的專案。
使用秘密金鑰
Authentication:Microsoft:ClientId
和Authentication:Microsoft:ClientSecret
,將敏感性設定儲存在本機秘密存放區中:dotnet user-secrets set "Authentication:Microsoft:ClientId" "<client-id>" dotnet user-secrets set "Authentication:Microsoft:ClientSecret" "<client-secret>"
:
分隔符號不適用於所有平台上的環境變數階層式機碼。 __
,雙底線,為:
- 所有平台都支援。 例如,Bash 不支援
:
分隔符號,但支援__
。 - 自動由
:
取代
設定 Microsoft 帳戶驗證
將 Microsoft 帳戶服務新增至 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().AddMicrosoftAccount(microsoftOptions =>
{
microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ClientId"];
microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
});
}
AddAuthentication(IServiceCollection, String) 多載會設定 DefaultScheme 屬性。 AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) 多載允許設定驗證選項,其可用於設定不同用途的預設驗證配置。 後續對 AddAuthentication
的呼叫會覆寫先前設定的 AuthenticationOptions 屬性。
每個驗證配置只能呼叫一次註冊驗證處理常式的 AuthenticationBuilder 擴充方法。 存在允許設定配置屬性、配置名稱和顯示名稱的多載。
如需 Microsoft 帳戶驗證支援的組態選項的詳細資訊,請參閱 MicrosoftAccountOptions API 參考。 這可用於要求使用者的不同資訊。
使用 Microsoft 帳戶登入
執行應用程式並選取[登入]。 隨即會出現使用 Microsoft 登入的選項。 當您在 Microsoft 上選取時,系統會將您重新導向至 Microsoft 以進行驗證。 使用您的 Microsoft 帳戶登入之後,系統會提示您讓應用程式存取您的資訊:
點選[是],系統會將您重新導向回您可以設定電子郵件的網站。
您現在已使用您的 Microsoft 認證登入。
多個驗證提供者
當應用程式需要多個提供者時,請鏈結 AddAuthentication 背後的提供者擴充方法:
services.AddAuthentication()
.AddMicrosoftAccount(microsoftOptions => { ... })
.AddGoogle(googleOptions => { ... })
.AddTwitter(twitterOptions => { ... })
.AddFacebook(facebookOptions => { ... });
使用 Proxy 或負載平衡器轉送要求資訊
如果將應用程式部署於 Proxy 伺服器或負載平衡器後方,可能就會在要求標頭中將一些原始要求資訊轉送到應用程式。 此資訊通常會包括安全要求配置 (https
)、主機和用戶端 IP 位址。 應用程式不會自動讀取這些要求標頭來探索並使用原始要求資訊。
此配置可用於產生連結,其會對使用外部提供者的驗證流程產生影響。 遺失安全配置 (https
) 會導致應用程式產生不正確且不安全的重新導向 URL。
使用轉送標頭中介軟體,使應用程式能夠使用原始要求資訊來處理要求。
如需詳細資訊,請參閱設定 ASP.NET Core 以處理 Proxy 伺服器和負載平衡器。
疑難排解
如果 Microsoft 帳戶提供者將您重新導向至登入錯誤頁面,請記錄 Uri 中
#
(hashtag) 後面的錯誤標題和描述查詢字串參數。雖然錯誤訊息似乎表示 Microsoft 驗證有問題,但最常見的原因是您的應用程式 URI 不符合針對 Web 平台所指定的任何重新導向 URI。
如果 Identity 未透過在
ConfigureServices
中呼叫services.AddIdentity
來設定,嘗試驗證將會產生 ArgumentException:必須提供 'SignInScheme' 選項。 此範例中使用的專案範本可確保這樣做。如果尚未經由套用初始移轉來建立網站資料庫,則會收到處理要求時資料庫作業失敗錯誤。 點選[套用移轉]以建立資料庫,並重新整理以便在發生錯誤後繼續進行。
下一步
- 本文說明如何向 Microsoft 進行驗證。 您可以遵循類似的方法,向上一頁所列的其他提供者進行驗證。
- 將網站發佈至 Azure Web 應用程式之後,請在 Microsoft 開發人員入口網站中建立新的用戶端密碼。
- 在 Azure 入口網站中將
Authentication:Microsoft:ClientId
和Authentication:Microsoft:ClientSecret
設定為應用程式設定。 設定系統已設為從環境變數讀取金鑰。