讓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驗證」,如下圖,
最近在我的IIS 8.5上測試,發現一樣是這樣設定,但IIS卻會有「不能同時使用查問式驗證及登入重新導向式驗證。(Challenge-base and login redirect-based authentication cannot be used simultaneously.)」的警訊,如下,
而直接用IE開啟 LoginWin.aspx 時,果然不理會 Windows 整合驗證 ,直接就被導到登入頁面去。如下,
研究
在網路上找到「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驗證。
3.以系統管理員身份開啟命令提示字元,並執行以下的Command,如下,
C:\Windows\System32\inetsrv\appcmd unlock config /section:anonymousAuthentication
C:\Windows\System32\inetsrv\appcmd unlock config /section:windowsauthentication
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是應用程式集區使用「整合式」的設定方式,如下是「傳統」的話,請改用以下的方式哦!
再來用IE開啟 LoginWin.aspx ,就會走Windows驗證的方式,如下,
因為我是local測試,算是「近端內部網路」,所以會自動登入。
如果要測試不同的帳號,可以將設定改成「提示輸入使用者名稱及密碼」(IE->工具->網際網路選項->安全性->近端內部網路->自訂等級->使用者驗証->登入),如下,
範例程式
參考資料
IIS 7.0 Two-Level Authentication with Forms Authentication and Windows Authentication
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^