前言
在 多個 Web Application 使用同一個 Forms Authentication 之中,
我們透過設定相同的 machineKey 來達到讓不同的 Web Application 所產生的 forms-base authentication cookie 是可以相通的。
而測試是在這些 Web Application 在同一台機器之中,如果是不同的機器時,例如(http://ap1.rmtech.com/ 與 http://ap2.rmtech.com/),又該如何處理呢?
實作
1.建立2個 WebForm 範例程式 Web1 & Web2
2個 Web Application 中各有 login.aspx 及 default.aspx ,分別做登入及顯示登入者的訊息,
login.aspx
1 | <!DOCTYPE html> |
default.aspx
1 | <!DOCTYPE html> |
web.config
1 |
|
註: 如果 machineKey 中的 validation 要使用別的演算法,例如 AES, 3DES 的話,就要再設定 compatibilityMode 為 Framework20SP2 or Framework20SP1 ,詳細請參考 MachineKeySection.CompatibilityMode
2.在 IIS 中建立2個網站(ap1, ap2)
在 IIS 中,分別新增 ap1 及 ap2 ,同時設定 主機名稱 (ap1.rmtech.com 及 ap2.rmtech.com)來代表不同的機器,如下,
3.在 hosts 檔案中,新增本機與那2個網站的對應
在 C:\Windows\System32\drivers\etc\hosts 檔案中加入 ap1 & ap2 的對應
1 | 127.0.0.1 ap1.rmtech.com |
4.測試 ap1.rmtech.com 與 ap2.rmtech.com forms-authentication cookie 是否能互通
透過 Browser 連到 ap1.rmtech.com/login.aspx ,登入後,會導到 default.aspx
查看它的 cookies 可以發現有一個 ShareAuth 的 cookie ,它的 domain 為 ap1.rmtech.com 。
在原有 Browser 開啟新的 tab ,並輸入 ap2.rmtech.com/default.aspx ,會發現被導到 login.aspx ,
而 Cookies 中並看不到 ShareAuth 的 cookie 。
登入後,可以發現 ap2 也有一個 ShareAuth 的 cookie ,它的 domain 為 ap2.rmtech.com 。
從上面的操作可以發現,目前這樣是無法達到不同機器的 Web Application 的 Single sign-on,
因為存入的 Cookie 是不同的 domain 。
解法
所以,只要讓 ap1 及 ap2 可以互通 Cookie 即可,就在 forms tag 屬性 多加入 domain 的設定,如下,
web.config
1 |
|
當 ap1, ap2 的 web.config 都設定好之後,再重新開啟 Browser ,ap1 登入後,可以發現 ShareAuth cookie 的 domain 為 .rmtech.com 。
再原有的 Browser 中,再開啟新的 Tab 連到 ap2.rmtech.com/default ,可以發現可以正常顯示,查看 cookie 也有取到原有 ap1 所寫入的 ShareAuth 這個 cookie 。
範例請參考cross-machines-formsbase-auth-sso
參考資料
Implement forms-based authentication in an ASP.NET application by using C#.NET
MachineKeySection.CompatibilityMode
多個 Web Application 使用同一個 Forms Authentication
如何在 ASP.NET 中設定舊版加密模式