共用方式為


ASP.NET Core 模組和 IIS 的進階設定

注意

這不是這篇文章的最新版本。 如需目前的版本,請參閱 本文的 .NET 9 版本。

警告

不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支持原則。 如需目前的版本,請參閱 本文的 .NET 9 版本。

重要

這些發行前產品的相關資訊在產品正式發行前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。

如需目前的版本,請參閱 本文的 .NET 9 版本。

本文涵蓋 ASP.NET Core 模組和 IIS 的進階組態選項和案例。

修改堆疊大小

只有在使用同處理序裝載模型時才適用。

使用 web.config 檔案中的 stackSize 設定來設定受控堆疊大小 (以位元組為單位)。 預設大小為 1,048,576 個位元組 (1 MB)。 下列範例會將堆疊大小變更為 2 MB (2,097,152 個位元組):

<aspNetCore processPath="dotnet"
    arguments=".\MyApp.dll"
    stdoutLogEnabled="false"
    stdoutLogFile="\\?\%home%\LogFiles\stdout"
    hostingModel="inprocess">
  <handlerSettings>
    <handlerSetting name="stackSize" value="2097152" />
  </handlerSettings>
</aspNetCore>

不允許在設定時輪替

disallowRotationOnConfigChange 設定適用於藍綠案例,其中全域設定的變更不應導致所有站台回收。 當此旗標為 true 時,只有與站台本身相關的變更才會讓它回收。 例如,如果 web.config 變更,或從 IIS 的觀點來看,站台路徑相關事項變更,站台就會回收。 但是對 applicationHost.config 的一般變更不會造成應用程式回收。 下列範例會將此設定設為 true:

<aspNetCore processPath="dotnet"
    arguments=".\MyApp.dll"
    stdoutLogEnabled="false"
    stdoutLogFile="\\?\%home%\LogFiles\stdout"
    hostingModel="inprocess">
  <handlerSettings>
    <handlerSetting name="disallowRotationOnConfigChange" value="true" />
  </handlerSettings>
</aspNetCore>

此設定對應至 API ApplicationPoolRecycling.DisallowRotationOnConfigChange

降低應用程式回收期間 503 的可能性

根據預設,當 IIS 收到回收或關機通知,以及當 ANCM 告知受控伺服器起始關機時,會有一秒的延遲。 延遲可透過 ANCM_shutdownDelay 環境變數或設定 shutdownDelay 處理常式設定來設定。 這兩個值都是以毫秒為單位。 延遲主要是為了降低競爭的可能性,其中:

  • IIS 尚未啟動佇列要求以移至新的應用程式。
  • ANCM 會開始拒絕進入舊應用程式的新要求。

此設定並不表示此數量將會延遲傳入要求。 此設定表示舊的應用程式執行個體會在逾時發生後開始關閉。 較緩慢的機器或 CPU 使用量較繁重的機器可能需要調整此值,以降低 503 的可能性。

下列範例會將延遲設定為 5 秒:

<aspNetCore processPath="dotnet"
    arguments=".\MyApp.dll"
    stdoutLogEnabled="false"
    stdoutLogFile="\\?\%home%\LogFiles\stdout"
    hostingModel="inprocess">
  <handlerSettings>
    <handlerSetting name="shutdownDelay" value="5000" />
  </handlerSettings>
</aspNetCore>

Proxy 組態使用 HTTP 通訊協定和配對權杖

僅適用於跨處理序裝載。

在 ASP.NET Core 模組與 Kestrel 之間建立的 Proxy 會使用 HTTP 通訊協定。 沒有從伺服器外的位置竊聽模組與 Kestrel 之間流量的風險。

配對權杖用來保證 Kestrel 所接收的要求已由 IIS 代理,而且不是來自其他來源。 模組會建立配對權杖,並將其設定成環境變數 (ASPNETCORE_TOKEN)。 配對權杖也會設定成每個代理要求的標頭 (MS-ASPNETCORE-TOKEN)。 IIS 中介軟體會檢查其收到的每個要求,以確認配對權杖的標頭值符合環境變數值。 如果權杖值不相符,將記錄並拒絕要求。 使用者無法從伺服器外的位置存取配對權杖環境變數,以及模組與 Kestrel 之間的流量。 在不知道配對權杖值的情況下,網路攻擊者無法略過 IIS 中介軟體的檢查送出要求。

具有 IIS 共用設定的 ASP.NET Core 模組

ASP.NET Core 模組安裝程式會以 TrustedInstaller 帳戶的權限執行。 由於本機系統帳戶並未具備 IIS 共用設定所使用的共用路徑修改權限,因此,安裝程式在嘗試於共用上的 applicationHost.config 檔案中進行模組設定時,會擲回拒絕存取的錯誤。

在與 IIS 安裝相同的電腦上使用 IIS 共用設定時,請執行 ASP.NET Core 裝載套件組合安裝程式並將 OPT_NO_SHARED_CONFIG_CHECK 參數設為 1

dotnet-hosting-{VERSION}.exe OPT_NO_SHARED_CONFIG_CHECK=1

若共用設定的路徑位於與 IIS 安裝不同的電腦上,請遵循下列步驟:

  1. 停用「IIS 共用設定」。
  2. 執行安裝程式。
  3. 將已更新的 applicationHost.config 檔案匯出至檔案共用。
  4. 重新啟用「IIS 共用設定」。

資料保護

ASP.NET Core 資料保護堆疊是由數個 ASP.NET Core 中介軟體所使用,包括用於驗證的中介軟體。 即使資料保護 API 不是由使用者程式碼呼叫,仍應使用部署指令碼或是在使用者程式碼中設定資料保護,以建立持續性的密碼編譯金鑰存放區。 如不設定資料保護,金鑰會保留在記憶體中,並於應用程式重新啟動時捨棄。

如果資料保護金鑰環儲存在記憶體中,則當應用程式重新啟動時:

  • 所有以 cookie 為基礎的驗證權杖都會失效。
  • 當使用者提出下一個要求時,需要再次登入。
  • 所有以 Keyring 保護的資料都無法再解密。 這可能會包含 CSRF 權杖ASP.NET Core MVC TempData cookie

若要在 IIS 下設定資料保護以保存 Keyring,請使用下列其中一種方法:

  • 建立資料保護登錄機碼

    ASP.NET Core 應用程式所使用的資料保護金鑰會儲存在應用程式外部的登錄中。 若要保存指定應用程式的金鑰,請為應用程式集區建立登錄機碼。

    若為獨立的非Web 伺服陣列 IIS 安裝,請針對搭配使用 ASP.NET Core 應用程式的每個應用程式集區,使用資料保護 Provision-AutoGenKeys.ps1 PowerShell 指令碼。 此指令碼會在 HKLM 登錄中建立登錄機碼,只有應用程式之應用程式集區的背景工作處理序帳戶可以存取它。 處於 rest 期間使用 DPAPI 和全電腦金鑰加密金鑰。

    在 Web 伺服陣列案例中,應用程式可以設定成使用 UNC 路徑來儲存其資料保護 Keyring。 根據預設,金鑰不予加密。 請確保網路共用的檔案權限僅限於執行應用程式的 Windows 帳戶。 可以使用 X509 憑證來保護處於 rest 的金鑰。 請考慮下列讓使用者上傳憑證的機制。 將憑證放入使用者的受信任憑證存放區,並確保在執行使用者應用程式的所有電腦上都能使用這些憑證。 如需詳細資訊,請參閱設定 ASP.NET Core 資料保護

  • 設定 IIS 應用程式集區載入使用者設定檔

    此設定位在應用程式集區 [進階設定] 下的 [處理序模型] 區段中。 將 [載入使用者設定檔] 設為 True。 當設定為 True 時,金鑰會儲存在使用者設定檔目錄中,且使用具有使用者帳戶專屬金鑰的 DPAPI 保護。 金鑰會保存至 %LOCALAPPDATA%/ASP.NET/DataProtection-Keys 資料夾。

    應用程式集區的 setProfileEnvironment 屬性也必須啟用。 setProfileEnvironment 的預設值為 true。 在某些情況下 (例如 Windows OS),setProfileEnvironment 會設為 false。 如果金鑰並未如預期地儲存在使用者設定檔目錄中:

    1. 瀏覽至 %windir%/system32/inetsrv/config 資料夾。
    2. 開啟 applicationHost.config 檔案。
    3. 找到 <system.applicationHost><applicationPools><applicationPoolDefaults><processModel> 項目。
    4. 確認 setProfileEnvironment 屬性不存在 (其預設值為 true),或明確地將屬性值設為 true
  • 將檔案系統當作 Keyring 存放區使用

    調整應用程式程式碼,以將檔案系統當作 Keyring 存放區使用。 使用 X509 憑證來保護 Keyring,並確保憑證是受信任的憑證。 如果憑證為自我簽署,請將憑證放在受信任的根存放區。

    在 Web 伺服陣列中使用 IIS 時:

    • 請使用所有電腦都可以存取的檔案共用。
    • 將 X509 憑證部署到每一部電腦。 設定程式碼中的資料保護
  • 設定資料保護的全電腦原則

    針對取用資料保護 API 的所有應用程式,資料保護系統僅支援有限的預設全電腦原則設定。 如需詳細資訊,請參閱 ASP.NET Core 資料保護概觀

IIS 組態

Windows Server 作業系統

啟用網頁伺服器 (IIS) 伺服器角色,並建立角色服務。

  1. 使用來自 [管理] 功能表的 [新增角色及功能] 精靈,或是 [伺服器管理員] 中的連結。 在伺服器角色步驟中,核取 [網頁伺服器 (IIS)] 方塊。

    在選取伺服器角色步驟中選取網頁伺服器 IIS 角色。

  2. 在 [功能] 步驟之後,[角色服務] 步驟會針對網頁伺服器 (IIS) 進行載入。 選取所需的 IIS 角色服務或接受所提供的預設角色服務。

    在選取角色服務步驟中,選取預設的角色服務。

    Windows 驗證 (選擇性)
    若要啟用 Windows 驗證,請展開下列節點:[網頁伺服器]>[安全性]。 選取 [Windows 驗證] 功能。 如需詳細資訊,請參閱 Windows 驗證<windowsAuthentication>設定 Windows 驗證

    WebSocket (選擇性)
    WebSocket 由 ASP.NET Core 1.1 或更新版本所支援。 若要啟用 WebSocket,請展開下列節點:[網頁伺服器]>[應用程式開發]。 選取 [WebSocket 通訊協定] 功能。 如需詳細資訊,請參閱 WebSockets

  3. 透過確認步驟繼續作業,安裝網頁伺服器角色和服務。 安裝網頁伺服器 (IIS) 角色之後,不需要重新啟動伺服器/IIS。

Windows 桌面作業系統

啟用 [IIS 管理主控台] 和 [World Wide Web 服務]

  1. 瀏覽到 [控制台]> [程式]> [程式和功能]>[開啟或關閉 Windows 功能] \(畫面左側\)。

  2. 開啟 [Internet Information Services] 節點。 開啟 [Web 管理工具] 節點。

  3. 核取 [IIS 管理主控台] 方塊。

  4. [World Wide Web Services] (全球資訊網服務) 核取方塊。

  5. 接受全球資訊網服務的預設功能,或自訂 IIS 功能。

    Windows 驗證 (選擇性)
    若要啟用 Windows 驗證,請展開下列節點:[World Wide Web 服務]>[安全性]。 選取 [Windows 驗證] 功能。 如需詳細資訊,請參閱 Windows 驗證<windowsAuthentication>設定 Windows 驗證

    WebSocket (選擇性)
    WebSocket 由 ASP.NET Core 1.1 或更新版本所支援。 若要啟用 WebSocket,請展開下列節點:[World Wide Web 服務]>[應用程式開發功能]。 選取 [WebSocket 通訊協定] 功能。 如需詳細資訊,請參閱 WebSockets

  6. 若 IIS 安裝需要重新啟動,請重新啟動系統。

選取 [Windows 功能] 中的 [IIS 管理主控台] 和 [World Wide Web Services] (全球資訊網服務)。

虛擬目錄

ASP.NET Core 應用程式不支援 IIS 虛擬目錄。 應用程式能以子應用程式的形式裝載。

子應用程式

ASP.NET Core 應用程式能以 IIS 子應用程式的形式裝載。 子應用程式的路徑會成為根應用程式 URL 的一部分。

子應用程式內的靜態資產連結應該在 MVC 和 Razor Pages 中使用波狀符號與斜線 (~/) 標記法。 波狀符號與斜線標記法會觸發標記協助程式以將子應用程式的路徑基底附加到轉譯的相對連結前面。 針對位於 /subapp_path 的子應用程式,使用 src="~/image.png" 連結的影像會轉譯為 src="/subapp_path/image.png"。 根應用程式的靜態檔案中介軟體不會處理靜態檔案要求。 要求會由子應用程式的靜態檔案中介軟體處理。

注意

Razor 元件 (.razor) 不應該使用波狀符號與斜線標記法。 如需詳細資訊,請參閱 Blazor 應用程式基礎路徑文件

若靜態資產的 src 屬性是設定為絕對路徑 (例如,src="/image.png"),會以不使用子應用程式路徑基底的方式轉譯連結。 根應用程式的靜態檔案中介軟體會嘗試從根應用程式的 webroot 提供資產,這會導致「404 - 找不到」回應 (除非根應用程式可存取靜態資產)。

裝載 ASP.NET Core 應用程式做為另一個 ASP.NET Core 應用程式下的子應用程式:

  1. 為子應用程式建立應用程式集區。 將 [.NET CLR 版本] 設定為 [沒有受控碼],因為會將核心通用語言執行平台 (CoreCLR) 開機以在背景工作處理序中裝載應用程式,而非在桌面 CLR (.NET CLR) 中裝載。

  2. 使用根網站下資料夾中的子應用程式在 IIS 管理員中新增根網站。

  3. 以滑鼠右鍵按一下 IIS 管理員中的子應用程式資料夾,然後選取 [轉換成應用程式]

  4. 在 [新增應用程式] 對話方塊中,使用 [應用程式集區] 的[選取] 按鈕來指派您為子應用程式建立的應用程式集區。 選取 [確定]。

將不同的應用程式集區指派給子應用程式是使用同處理序裝載模型。

如需有關同處理序裝載模型與如何設定 ASP.NET Core 模組的詳細資訊,請參閱適用於 IIS 的 ASP.NET Core 模組 (ANCM)

應用程式集區

應用程式集區隔離取決於裝載模型:

  • 同處理序裝載:應用程式必須在分開的應用程式集區中執行。
  • 跨處理序裝載:建議藉由在各自的應用程式集區中執行每個應用程式,以將應用程式互相隔離。

IIS [新增網站] 對話方塊預設每個應用程式皆為單一應用程式集區。 當提供網站名稱時,文字會自動轉移至 [應用程式集區] 文字方塊。 新增網站時,會使用該網站名稱建立新的應用程式集區。

應用程式集區 Identity

應用程式集區 identity 帳戶可讓應用程式在唯一的帳戶下執行,不必建立及管理網域或本機帳戶。 在 IIS 8.0 或更新版本中,IIS 管理背景工作處理序 (WAS) 會使用新的應用程式集區名稱建立虛擬帳戶,並預設在此帳戶下執行應用程式集區的背景工作處理序。 在 IIS 管理主控台中,於應用程式集區的 [進階設定] 下,確定 Identity 設定為使用 ApplicationPoolIdentity

應用程式集區進階設定對話方塊

IIS 管理程序會在 Windows 安全系統中,以應用程式集區的名稱建立安全識別碼。 可使用此 identity 來保護資源。 不過,此 identity 不是真正的使用者帳戶,也不會顯示在 Windows 使用者管理主控台中。

如果 IIS 背景工作處理序需要提升應用程式的存取權限,請修改包含應用程式的目錄存取控制清單 (ACL):

  1. 開啟 Windows 檔案總管,巡覽至目錄。

  2. 以滑鼠右鍵按一下目錄並選取 [屬性]

  3. 依序選取 [安全性] 索引標籤下的 [編輯] 按鈕和 [新增] 按鈕。

  4. 選取 [位置] 按鈕,並確定選取系統。

  5. 在 [輸入要選取的物件名稱] 區域中輸入 IIS AppPool\{APP POOL NAME} 格式 (其中預留位置 {APP POOL NAME} 是應用程式集區名稱)。 選取 [檢查名稱] 按鈕。 針對 [DefaultAppPool],請使用 IIS AppPool\DefaultAppPool 檢查名稱。 選取 [檢查名稱] 按鈕時,DefaultAppPool 的值便會顯示於物件名稱區域中。 您無法直接將應用程式集區名稱輸入至物件名稱區域。 檢查物件名稱時,請使用 IIS AppPool\{APP POOL NAME} 格式 (其中預留位置 {APP POOL NAME} 是應用程式集區名稱)。

    針對應用程式資料夾選取使用者或群組對話方塊:在選取 [檢查名稱] 之前,

  6. 選取 [確定]。

    針對應用程式資料夾選取使用者或群組對話方塊:選取 [檢查名稱] 之後,物件名稱

  7. 預設應該會授與讀取與執行權限。 請視需要提供其他權限。

也可使用 ICACLS 工具透過命令提示字元授與存取權限。 使用 DefaultAppPool 作為範例,下列命令用於授與 MyWebApp 資料夾、子資料夾和檔案的讀取和執行權限:

ICACLS C:\sites\MyWebApp /grant "IIS AppPool\DefaultAppPool:(OI)(CI)RX"

如需詳細資訊,請參閱 icacls 主題。

HTTP/2 支援

在下列 IIS 部署案例中,ASP.NET Core 支援 HTTP/2

  • 同處理序
    • Windows Server 2016/Windows 10 或更新版本;IIS 10 或更新版本
    • TLS 1.2 或更新版本連線
  • 跨處理序
    • Windows Server 2016/Windows 10 或更新版本;IIS 10 或更新版本
    • 公開 Edge Server 連線使用 HTTP/2,但是對 Kestrel 伺服器的反向 Proxy 連線使用 HTTP/1.1。
    • TLS 1.2 或更新版本連線

針對建立 HTTP/2 連線時的同處理序部署,HttpRequest.Protocol 會回報 HTTP/2。 針對建立 HTTP/2 連線時的跨處理序部署,HttpRequest.Protocol 會回報 HTTP/1.1

如需有關同處理序和跨處理序主控模型的詳細資訊,請參閱適用於 IIS 的 ASP.NET Core Module (ANCM)

HTTP/2 預設為啟用。 如果 HTTP/2 連線尚未建立,連線會退為 HTTP/1.1。 如需使用 IIS 部署之 HTTP/2 設定的詳細資訊,請參閱 IIS 上的 HTTP/2

CORS 預檢要求

此節只適用於以 .NET Framework 為目標的 ASP.NET Core 應用程式。

針對以 .NET Framework 為目標的 ASP.NET Core 應用程式,在 IIS 中OPTIONS 要求預設不會傳遞到應用程式。 若要了解如何在 web.config 中設定應用程式的 IIS 處理常式以傳遞 OPTIONS 要求,請參閱在 ASP.NET Web API 2 中啟用跨原始來源要求:CORS 的運作方式

應用程式初始化模組與閒置逾時

在 IIS 中由 ASP.NET Core 模組版本 2 裝載時:

應用程式初始化模組

套用到應用程式裝載同處理序與非同處理序。

IIS 應用程式初始化是一項 IIS 功能,可在應用程式集區啟動或回收時,將 HTTP 要求傳送給應用程式。 要求會觸發應用程式啟動。 根據預設,IIS 會發出應用程式根 URL (/) 的要求以初始化應用程式 (如需有關設定的詳細資訊,請參閱額外資源)。

確認已啟用「IIS 應用程式初始化」角色功能:

在 Windows 7 或更新的電腦系統上,當在本機使用 IIS 時:

  1. 瀏覽到 [控制台]> [程式]> [程式和功能]>[開啟或關閉 Windows 功能] \(畫面左側\)。
  2. 開啟 [網際網路資訊服務]>[World Wide Web 服務]>[應用程式開發功能]
  3. 選取 [應用程式初始化] 的核取方塊。

在 Windows Server 2008 R2 或更新版本上:

  1. 開啟「新增角色與功能精靈」
  2. 在 [選取角色服務] 面板中,開啟 [應用程式開發] 節點。
  3. 選取 [應用程式初始化] 的核取方塊。

使用下列任一方式為網站啟用應用程式初始化模組:

  • 使用 IIS 管理員:

    1. 選取 [連線] 面板中的 [應用程式集區]
    2. 以滑鼠右鍵按一下清單中應用程式的應用程式集區,然後選取 [進階設定]
    3. 預設的 [啟動模式]OnDemand。 將 [啟動模式] 設定為 AlwaysRunning。 選取 [確定]。
    4. 開啟 [連線] 面板中的 [站台] 節點。
    5. 以滑鼠右鍵按一下應用程式,然後選取 [管理網站]> [進階設定]
    6. 預設 [預先載入已啟用] 設定是 False。 將 [預先載入已啟用] 設定為 True。 選取 [確定]。
  • 使用 web.config,新增 <applicationInitialization> 元素並將 doAppInitAfterRestart 設定為 true 至應用程式的 web.config 檔案中的 <system.webServer> 元素:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <location path="." inheritInChildApplications="false">
        <system.webServer>
          <applicationInitialization doAppInitAfterRestart="true" />
        </system.webServer>
      </location>
    </configuration>
    

閒置逾時

僅適用於應用程式裝載同處理序。

若要防止應用程式閒置,請使用 IIS 管理員設定應用程式集區的閒置逾時:

  1. 選取 [連線] 面板中的 [應用程式集區]
  2. 以滑鼠右鍵按一下清單中應用程式的應用程式集區,然後選取 [進階設定]
  3. 預設 [閒置逾時 (分鐘)]20 分鐘。 將 [閒置逾時 (分鐘)] 設定為 0 (零)。 選取 [確定]。
  4. 回收背景工作處理序。

若要防止應用程式裝載非同處理序逾時,請使用下列任一方式:

應用程式初始化模組與閒置逾時額外資源

模組、結構描述及設定檔位置

模組

IIS (x86/amd64):

  • %windir%\System32\inetsrv\aspnetcore.dll

  • %windir%\SysWOW64\inetsrv\aspnetcore.dll

  • %ProgramFiles%\IIS\Asp.Net Core Module\V2\aspnetcorev2.dll

  • %ProgramFiles(x86)%\IIS\Asp.Net Core Module\V2\aspnetcorev2.dll

IIS Express (x86/amd64):

  • %ProgramFiles%\IIS Express\aspnetcore.dll

  • %ProgramFiles(x86)%\IIS Express\aspnetcore.dll

  • %ProgramFiles%\IIS Express\Asp.Net Core Module\V2\aspnetcorev2.dll

  • %ProgramFiles(x86)%\IIS Express\Asp.Net Core Module\V2\aspnetcorev2.dll

結構描述

IIS

  • %windir%\System32\inetsrv\config\schema\aspnetcore_schema.xml

  • %windir%\System32\inetsrv\config\schema\aspnetcore_schema_v2.xml

IIS Express

  • %ProgramFiles%\IIS Express\config\schema\aspnetcore_schema.xml

  • %ProgramFiles%\IIS Express\config\schema\aspnetcore_schema_v2.xml

組態

IIS

  • %windir%\System32\inetsrv\config\applicationHost.config

IIS Express

  • Visual Studio:{APPLICATION ROOT}\.vs\config\applicationHost.config

  • iisexpress.exe CLI:%USERPROFILE%\Documents\IISExpress\config\applicationhost.config

applicationHost.config 檔案中搜尋 aspnetcore 即可找到檔案。

使用 Visual Studio 發佈時安裝 Web Deploy

將應用程式部署到具有 Web Deploy 的伺服器時,請在伺服器上安裝最新版的 Web Deploy。 若要安裝 Web Deploy,請參閱 IIS 下載:Web Deploy

建立 IIS 網站

  1. 在主控系統上,請建立資料夾以容納應用程式的已發行資料夾和檔案。 在下列步驟中,您提供資料夾路徑給 IIS,作為應用程式的實體路徑。 如需應用程式的部署資料夾和檔案配置的相關詳細資訊,請參閱 ASP.NET Core 目錄結構

  2. 在 [IIS 管理員] 中,於 [連線] 面板中開啟伺服器的節點。 以滑鼠右鍵按一下 [網站] 資料夾。 從操作功能表選取 [新增網站]

  3. 提供網站名稱,並將實體路徑設定為應用程式的部署資料夾。 透過選取 [確定] 來提供繫結設定並建立網站:

    在新增網站步驟中提供站台名稱、實體路徑和主機名稱。

    警告

    使用最上層萬用字元繫結 (http://*:80/http://+:80)。 最上層萬用字元繫結可能暴露您的應用程式安全性弱點。 這對強式與弱式萬用字元皆適用。 請使用明確主機名稱,而非萬用字元。 若您擁有整個父網域 (與具弱點的 *.com 相對) 的控制權,則子網域萬用字元繫結 (例如 *.mysub.com) 就沒有此安全性風險。 如需詳細資訊,請參閱 RFC 9110:HTTP 語意 (第 7.2 節:主機和 :authority)

  4. 在伺服器的節點之下,選取 [應用程式集區]

  5. 以滑鼠右鍵按一下網站的應用程式集區,然後從操作功能表選取 [基本設定]

  6. 在 [編輯應用程式集區] 視窗中,將 [.NET CLR 版本] 設定為 [沒有受控碼]

    將 .NET CLR 版本設為 [沒有受控碼]。

    ASP.NET Core 會在不同的處理序中執行,並管理執行階段。 ASP.NET Core 不仰賴載入桌面 CLR (.NET CLR)。 會使用 .NET Core 的核心通用語言執行平台 (CoreCLR) 來開機,以在背景工作處理序中裝載應用程式。 將 [.NET CLR 版本] 設定為 [沒有受控碼] 是選擇性的,但建議這樣做。

    • 對於使用同處理序裝載模型的 32 位元 SDK 發佈的 32 位元 (x86) 自封式部署,啟用 32 位元的應用程式集區。 在 [IIS 管理員] 中,瀏覽至 [連線] 資訊看板中的 [應用程式集區]。 選取應用程式的應用程式集區。 在 [動作] 資訊看板中,選取 [進階設定]。 將 [啟用 32 位元應用程式] 設定為 True

    • 對於使用同處理序裝載模型的 64 位元 (x64) 自封式部署,停用 32 位元 (x86) 處理序的應用程式集區。 在 [IIS 管理員] 中,瀏覽至 [連線] 資訊看板中的 [應用程式集區]。 選取應用程式的應用程式集區。 在 [動作] 資訊看板中,選取 [進階設定]。 將 [啟用 32 位元應用程式] 設定為 False

  7. 確認處理序模型 identity 具有適當的權限。

    如果您將應用程式集區的預設 identity ([處理序模型]>Identity) 從 ApplicationPoolIdentity 變更為其他 identity,請確認新的 identity 具有必要權限,可存取應用程式的資料夾、資料庫和其他必要的資源。 例如,應用程式集區需要針對應用程式讀取和寫入檔案的資料夾取得讀取和寫入權限。

Windows 驗證設定 (選擇性)
如需詳細資訊,請參閱設定 Windows 驗證主題。

陰影複製

將應用程式組件的陰影複製到適用於 IIS 的 ASP.NET Core 模組 (ANCM) 可藉由部署應用程式離線檔案,提供比停止應用程式更好的使用者體驗。

當 ASP.NET Core 應用程式在 Windows 上執行時,二進位檔會遭到鎖定,因此無法加以修改或取代。 陰影複製可製作組件的複本,讓應用程式組件在應用程式執行時進行更新。

陰影複製並非為了啟用零停機部署,因此其預期 IIS 仍會回收應用程式,而某些要求可能會收到 503 服務無法使用回應。 我們建議針對零停機部署使用藍綠部署Azure 部署位置之類的模式。 陰影複製有助於將部署的停機時間降到最低,但無法完全予以消除。

web.config 中自訂 ANCM 處理常式設定以啟用陰影複製:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <remove name="aspNetCore"/>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".logsstdout">
      <handlerSettings>
        <handlerSetting name="enableShadowCopy" value="true" />
        <!-- Ensure that the IIS ApplicationPool identity has permission to this directory -->
        <handlerSetting name="shadowCopyDirectory" value="../ShadowCopyDirectory/" />
      </handlerSettings>
    </aspNetCore>
  </system.webServer>
</configuration>