使用 ASP.NET Core 進行 Microsoft 帳戶外部登入設定

作者:Valeriy NovytskyyRick Anderson

此範例示範如何使用上一頁建立的 ASP.NET Core 6.0 專案,讓使用者使用其工作、學校或個人 Microsoft 帳戶登入。

在 Microsoft 開發人員入口網站中建立應用程式

如果您沒有 Microsoft 帳戶,請選取[建立帳號]。 登入之後,系統會將您重新導向至[應用程式註冊]頁面:

  • 選取[新的註冊]
  • 輸入名稱
  • 選取支援帳戶類型的選項。
    • MicrosoftAccount 套件支援預設會支援使用「任何組織目錄中的帳戶」或「任何組織目錄中的帳戶和 Microsoft 帳戶」選項建立的應用程式進行註冊。
    • 若要使用其他選項,請將 MicrosoftAccountOptionsAuthorizationEndpointTokenEndpoint 成員 (用於初始化 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 應用程式(用戶端)標識碼,其位於[應用程式註冊] 的 [概觀] 頁面上,以及您在 [憑證與秘密] 頁面上建立的 [秘密] 頁面上使用秘密管理員建立的 [用戶端密碼]。 針對此範例,使用下列步驟:

  1. 依照啟用秘密儲存體的指示,初始化秘密儲存體的專案。

  2. 使用秘密金鑰 Authentication:Microsoft:ClientIdAuthentication: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:ClientIdAuthentication:Microsoft:ClientSecret 設定為應用程式設定。 設定系統已設為從環境變數讀取金鑰。

此範例示範如何使用上一頁建立的 ASP.NET Core 3.0 專案,讓使用者使用其工作、學校或個人 Microsoft 帳戶登入。

在 Microsoft 開發人員入口網站中建立應用程式

如果您沒有 Microsoft 帳戶,請選取[建立帳號]。 登入之後,系統會將您重新導向至[應用程式註冊]頁面:

  • 選取[新的註冊]
  • 輸入名稱
  • 選取支援帳戶類型的選項。
    • MicrosoftAccount 套件支援預設會支援使用「任何組織目錄中的帳戶」或「任何組織目錄中的帳戶和 Microsoft 帳戶」選項建立的應用程式進行註冊。
    • 若要使用其他選項,請將 MicrosoftAccountOptionsAuthorizationEndpointTokenEndpoint 成員 (用於初始化 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 應用程式(用戶端)標識碼,其位於[應用程式註冊] 的 [概觀] 頁面上,以及您在 [憑證與秘密] 頁面上建立的 [秘密] 頁面上使用秘密管理員建立的 [用戶端密碼]。 針對此範例,使用下列步驟:

  1. 依照啟用秘密儲存體的指示,初始化秘密儲存體的專案。

  2. 使用秘密金鑰 Authentication:Microsoft:ClientIdAuthentication: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:ClientIdAuthentication:Microsoft:ClientSecret 設定為應用程式設定。 設定系統已設為從環境變數讀取金鑰。