[ASP.NET]讓Web專案在IIS7中可運行 Forms Authentication (表單驗證) 及 Windows 驗證

讓Web專案在IIS7中可運行 Forms Authentication (表單驗證) 及 Windows 驗證。
最近在我的IIS 8.5上測試,發現一樣是這樣設定,但IIS卻會有「不能同時使用查問式驗證及登入重新導向式驗證。(Challenge-base and login redirect-based authentication cannot be used simultaneously.)」的警訊。
而直接用IE開啟 LoginWin.aspx 時,居然不理會 Windows 驗證 ,直接就被導到登入頁面去。

環境

Windows 8.1, IIS 8.5

 

問題

之前Web專案步署在 Windows 2003 時,整個Web專案是使用表單驗證。

如果有客戶要使用Windows整合驗證時,就會另外用一支程式(LoginWin.aspx)來接Windows的帳號資料,然後再用表單驗證的方式去登入系統。

而在IIS那,就針對 LoginWin.aspx 不要勾選「啟用匿名存取(A)」,然後勾選「整合式Windows驗證」,如下圖,

image

 

最近在我的IIS 8.5上測試,發現一樣是這樣設定,但IIS卻會有「不能同時使用查問式驗證及登入重新導向式驗證。(Challenge-base and login redirect-based authentication cannot be used simultaneously.)」的警訊,如下,

image

image

 

而直接用IE開啟 LoginWin.aspx 時,果然不理會 Windows 整合驗證 ,直接就被導到登入頁面去。如下,

image

 

研究

在網路上找到「IIS 7.0 Two-Level Authentication with Forms Authentication and Windows Authentication」。

作者寫了一個HttpModule (Mvolo.Modules.FormsAuthModule),可以讓我們達到這樣的功能!

設定方式如下,

1.Download Source code for FormsAuthModule wrapper v1.0. 建置成DLL,放到Web專案的Bin目錄。

2.在IIS中,一樣設定 LoginWin.aspx 啟用Windows驗證。

image

 

3.以系統管理員身份開啟命令提示字元,並執行以下的Command,如下,

C:\Windows\System32\inetsrv\appcmd unlock config /section:anonymousAuthentication
C:\Windows\System32\inetsrv\appcmd unlock config /section:windowsauthentication

image

 

4.修改Web專案的Web.config,如下,

4.1.在 configuration 區段中加入以下的設定,

<!-- FormsAuthsModule configuration section -->
<configSections>
	<section name="formsAuthenticationWrapper" 
		type="Mvolo.Modules.FormsAuthConfigurationSection" />
</configSections>

 

4.2.在 configuration 區段中加入針對 LoginWin.aspx 設定走Windows驗證,如下,

<location path="LoginWin.aspx">
	<!-- Disable Forms Authentication -->
	<formsAuthenticationWrapper enabled="false" />
	<system.webServer>
	  <security>
		<!-- Enable IIS Windows authentication for the login page -->
		<authentication>
		  <windowsAuthentication enabled="true" />
		  <anonymousAuthentication enabled="true" />
		</authentication>
	  </security>
	</system.webServer>
</location>

 

4.3.加入HttpModule的設定,如下,

<system.webServer>
	<!--Replace the built-in FormsAuthenticationModule with the FormsAuthModule wrapper-->
	<modules>
	  <remove name="FormsAuthentication" />
	  <add name="FormsAuthentication" type="Mvolo.Modules.FormsAuthModule" />
	</modules>
</system.webServer>

 

範例的web.config設定如下,

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- FormsAuthsModule configuration section -->
  <configSections>
    <section name="formsAuthenticationWrapper" type="Mvolo.Modules.FormsAuthConfigurationSection" />
  </configSections>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <authorization>
      <deny users="?" />
      <allow users="*" />
    </authorization>
    <authentication mode="Forms">
      <forms name=".RMAuth" loginUrl="Login.aspx" />
    </authentication>
  </system.web>

  <location path="LoginWin.aspx">
    <!-- Disable Forms Authentication -->
    <formsAuthenticationWrapper enabled="false" />
    <system.webServer>
      <security>
        <!-- Enable IIS Windows authentication for the login page -->
        <authentication>
          <windowsAuthentication enabled="true" />
          <anonymousAuthentication enabled="true" />
        </authentication>
      </security>
    </system.webServer>
  </location>

  <system.webServer>
    <!--Replace the built-in FormsAuthenticationModule with the FormsAuthModule wrapper-->
    <modules>
      <remove name="FormsAuthentication" />
      <add name="FormsAuthentication" type="Mvolo.Modules.FormsAuthModule" />
    </modules>
  </system.webServer>
</configuration>

 

PS.以上設定httpModule是應用程式集區使用「整合式」的設定方式,如下是「傳統」的話,請改用以下的方式哦!  

<system.web> 
  <httpModules> 
    <add name="FormsAuthentication" type="Mvolo.Modules.FormsAuthModule" />
  </httpModules> 
</system.web> 

 

再來用IE開啟 LoginWin.aspx ,就會走Windows驗證的方式,如下,

image

因為我是local測試,算是「近端內部網路」,所以會自動登入。

如果要測試不同的帳號,可以將設定改成「提示輸入使用者名稱及密碼」(IE->工具->網際網路選項->安全性->近端內部網路->自訂等級->使用者驗証->登入),如下,

image

 

這樣就會彈出登入視窗讓您登入了,如下,
image

image

 

範例程式

 

參考資料

IIS 7.0 Two-Level Authentication with Forms Authentication and Windows Authentication

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^