我只能說…這真是一個漫長而充滿挑戰的過程…
首先, 準備一組AD環境來模擬公司網路的AD環境. 這邊我使用Windows Server 2012, 安裝AD DS, DNS, DHCP, Web Server在同一台機器上. 網域名稱是michaeldns.biz, Domain Controller電腦FQDN是pdc.michaeldns.biz.
由於目前還沒有要開始寫程式, 我只是單純地想要測試由Windows Azure ACS來整合內網的AD, 因此這邊我會先用一個根本不存在的網站來測試如何安裝與設定ADFS與Azure ACS, 預期是我應該要可以用預設的登入頁面來假裝要登入這個網站, 網站應該要向我要AD的帳密, 我驗證完成後, Azure應該要把我導到這個不存在的網站, 所以我雖然會得到一個HTTP 404錯誤, 但是應該要在IE上看到整個過程完成.
照著一般標準步驟做完dcpromo, 確定一切正常之後, 就可以準備安裝ADFS了.(這個步驟視情況大約需要1~2小時). 我在家裡的環境為了測試從外網接回AD Server大概多花了一個小時.
接著要來設定IIS的HTTPS憑證, 由於是測試, 這邊使用Self-Signed憑證來作為SSL連線使用的憑證. 進入IIS管理員, 左邊點選本台機器, 右邊雙擊Server Certificates
![image image](http://lh3.ggpht.com/-JJfEOUJ5igw/UHKHIilCeSI/AAAAAAAAAtw/1fRB-dQ2z3o/image_thumb.png?imgmax=800)
填上Friendly Name, 然後確定Certificate Store選到Personal後按確定即可
![image image](http://lh4.ggpht.com/-DdPF-Uor8Tw/UHKHKSHQ2CI/AAAAAAAAAuA/17_z0aMhtZI/image_thumb%25255B1%25255D.png?imgmax=800)
完成圖
![image image](http://lh4.ggpht.com/-HButcO7XILQ/UHKHMd9UZfI/AAAAAAAAAuQ/wP5U0Pjay2s/image_thumb%25255B2%25255D.png?imgmax=800)
接下來要開始安裝ADFS 2.0. 在2012 Server上安裝ADFS 2.0只需要從Server Manager中新增AD Federation Service這個Role就可以了, 安裝過程沒有甚麼需要特別注意的地方, 只要一直下一步就可以了 (不需要安裝ADFS 1.0相關的服務, 也不需要安裝ADFS Proxy). 安裝完成後可以在Server Manager的Dashboard上看到AD FS已經安裝完成
![image image](http://lh5.ggpht.com/-x4gNBIFlK4Q/UHKHOHmWOqI/AAAAAAAAAug/TrxJfvVM60U/image_thumb%25255B3%25255D.png?imgmax=800)
接著我們要來設定ADFS, 從這邊開啟ADFS管理員
![image image](http://lh3.ggpht.com/-22ulfVujpmE/UHKHQRazkzI/AAAAAAAAAuw/HScfnn-2mBI/image_thumb%25255B4%25255D.png?imgmax=800)
點這裡開始設定
![image image](http://lh6.ggpht.com/-3ncpwiuGnY0/UHKHR1RgVvI/AAAAAAAAAvA/uaxOpKDcVCE/image_thumb%25255B5%25255D.png?imgmax=800)
這裡直接按下一步, 因為現在是第一台ADFS伺服器
![image image](http://lh6.ggpht.com/-SmkG4mbYV6M/UHKHTQVKHpI/AAAAAAAAAvQ/5HHhJ8D8drM/image_thumb%25255B6%25255D.png?imgmax=800)
這邊可以選擇Standalone伺服器或是準備建立Federation Server Farm, 這裡我選擇Federation Server Farm然後按下一步
![image image](http://lh5.ggpht.com/-C-s_5vYxHsI/UHKHVEkSmGI/AAAAAAAAAvg/N04_CKY7AjY/image_thumb%25255B7%25255D.png?imgmax=800)
由於剛剛已經先設定好了IIS的SSL, 這裡系統會自動抓到剛剛設定的憑證, 按下一步.
![image image](http://lh6.ggpht.com/-z5sZi25rqdQ/UHKHXkLhLiI/AAAAAAAAAvw/N-i2S_IampA/image_thumb%25255B8%25255D.png?imgmax=800)
我是重新安裝, 因此這裡可以把舊的資料庫刪除以確保都是新的資料
![image image](http://lh3.ggpht.com/-FI_E4NqPhvc/UHKHZQtP5tI/AAAAAAAAAwA/mNagXlmUyk8/image_thumb%25255B9%25255D.png?imgmax=800)
選擇Service Account, 如果是建立Server Farm的話, 所有的Service都需要使用這個帳號.
![image image](http://lh4.ggpht.com/-07_eBfL0H7o/UHKHb_jWueI/AAAAAAAAAwQ/itYwz4kJFO8/image_thumb%25255B10%25255D.png?imgmax=800)
按下一步就會開始設定了
![image image](http://lh3.ggpht.com/-q_kw-f3JuBo/UHKHdw3RGPI/AAAAAAAAAwg/DX0KyA6eyuo/image_thumb%25255B11%25255D.png?imgmax=800)
視情況會出現一兩個警告. 第一個是說host/[Computer FQDN]這個SPN已經存在了. 第二個是說因為有照到之前設定的ADFS網站, 因此安裝程式沒有再建立一個新的. 這邊可以直接忽略.
![image image](http://lh5.ggpht.com/-Zccna_magis/UHKHf607ZQI/AAAAAAAAAww/yI6Zqb9z7P4/image_thumb%25255B12%25255D.png?imgmax=800)
如此初步的設定就完成了, 稍後我們還會需要回來這裡做ADFS的設定.
現在, 讓我們到Windows Azure Portal上來設定ACS
進入舊版管理網站後, 先建立一個ACS Namespace. 建立的過程相當直觀, 選好區域跟名稱案確定就可以了, 我的測試namespace是MichaelVirtualNet
![image image](http://lh5.ggpht.com/-KYKbtSQx3aY/UHKHikL0K7I/AAAAAAAAAxA/QJl2kd9UOFU/image_thumb%25255B13%25255D.png?imgmax=800)
接著選擇剛剛建立的Namespace, 按存取控制服務
![image image](http://lh4.ggpht.com/-jPZ_YRBkf7E/UHKHlrffBhI/AAAAAAAAAxQ/QGjfYNpx3Sg/image_thumb%25255B14%25255D.png?imgmax=800)
這會讓我們進入ACS管理介面, 首先新增一個Identity Provider
![image image](http://lh4.ggpht.com/-k5zm8V4KyhQ/UHKHn1YOXUI/AAAAAAAAAxg/Ipu98iEBU6M/image_thumb%25255B15%25255D.png?imgmax=800)
選擇新增一個WS-同盟識別提供者
![image image](http://lh6.ggpht.com/-J6wl3l6cELo/UHKHq8XUGAI/AAAAAAAAAxw/PTFLjiBFIXM/image_thumb%25255B16%25255D.png?imgmax=800)
輸入相關資訊. 在WS-同盟中繼資料的部分可以直接從我們剛剛設定的ADFS網站來下載. 其網址為https://[HOST IP]/FederationMetadata/2007-06/FederationMetadata.xml , 或是下載後儲存在以檔案的方式上傳. 設定完成後按儲存即可.
![image image](http://lh5.ggpht.com/-m55qIXg-Sy4/UHKHtdh5WmI/AAAAAAAAAyA/Igpo8ptvtuc/image_thumb%25255B17%25255D.png?imgmax=800)
接下來要新增信賴憑證者應用程式
![image image](http://lh3.ggpht.com/-J1zSDwKG2Mw/UHKHwU-jkwI/AAAAAAAAAyQ/w7JABm_nk8A/image_thumb%25255B19%25255D.png?imgmax=800)
在這裡會需要填上實際上的應用程式的網址, 但是現階段我根本還沒有要開始寫東西, 我只是想先確定這整個架構是正常的, 因此這邊我先隨便填一個https://vnclient.com, 稍後我會把這一塊的程式補上
![image image](http://lh4.ggpht.com/-tYGF9bPZN6s/UHKHy1OKN-I/AAAAAAAAAyg/yOVRb-GLfDo/image_thumb%25255B20%25255D.png?imgmax=800)
同一個畫面下半段的部分, 基本上只有識別提供者的部分需要視需求選擇, 這裡我選擇我的網站可以使用Windows Live ID, Google ID與我們的AD進行登入
![image image](http://lh5.ggpht.com/-wT4RPivTFTM/UHKH1ljQZPI/AAAAAAAAAyw/YKGqmDss8VU/image_thumb%25255B21%25255D.png?imgmax=800)
儲存. 接下來要設定規則群組. 可以選擇新增, 或是修改剛剛系統幫我們產生的預設群組. 這裡我選擇修改預設群組
![image image](http://lh4.ggpht.com/-gItSWijoTCk/UHKH4PftttI/AAAAAAAAAzA/_m6DIQ-2ctg/image_thumb%25255B24%25255D.png?imgmax=800)
點擊群組名稱就可以進入設定畫面. 整個規則設定的邏輯大約是
如果[識別提供者]是[XXX], 且[輸入宣告型別]是[OOO], 且[輸入宣告值]等於[任何值]或是特定值.
則
把輸入型別轉型成我想要的型別, 並且值為前端傳遞過來的值或是特定值
說起來很繞口, 其實就是在做mapping而已.
這邊我們把識別提供者Google所傳過來的http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name 這個值, 轉換為http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name (也就是直接傳遞)
設定完成大概會是這樣
![image image](http://lh6.ggpht.com/-8blLTSjGjns/UHKH69_Ug_I/AAAAAAAAAzQ/9WDvYJhXNnE/image_thumb%25255B25%25255D.png?imgmax=800)
接著到應用程式整合, 把WS-同盟中繼資料這一段copy起來.
回到ADFS管理員, 點中間這個Link
![image image](http://lh6.ggpht.com/-3FtCPXH5szo/UHKH8ymEpWI/AAAAAAAAAzg/wx3qQxn4CbA/image_thumb%25255B26%25255D.png?imgmax=800)
跳過歡迎畫面後, 把剛剛那一段網址貼到這裡來然後按下一步
![image image](http://lh4.ggpht.com/-vFcjMZE2PX0/UHKH-0E2VOI/AAAAAAAAAzw/gYaicQzHqB8/image_thumb%25255B27%25255D.png?imgmax=800)
這邊選擇Permit all users to access this relying party
![image image](http://lh3.ggpht.com/-B0uf_RJChNU/UHKIAqrOfdI/AAAAAAAAA0A/f_apkKFMHHo/image_thumb%25255B28%25255D.png?imgmax=800)
下一步到最後, 確定這裡有打勾
![image image](http://lh5.ggpht.com/-3WX8SpwMPPs/UHKICSN1I0I/AAAAAAAAA0Q/7fS4eC50hgM/image_thumb%25255B29%25255D.png?imgmax=800)
結束剛剛的精靈之後會自動帶出Edit Claim Rules的畫面, 按下的[Add Rules]
![image image](http://lh4.ggpht.com/-59QAfdjoP3A/UHKID5gWwjI/AAAAAAAAA0g/ciPql_-xSqo/image_thumb%25255B30%25255D.png?imgmax=800)
因為要整合AD, 這邊選擇Send LDAP Attributes as Claims
![image image](http://lh5.ggpht.com/-cUWKF0Hs6Fs/UHKIF9pzzaI/AAAAAAAAA0w/y8GLZH5K8iw/image_thumb%25255B31%25255D.png?imgmax=800)
隨便給一個rule name, 在Attribute Store的地方選擇Active Directory. 然後Mapping of LDAP attribute to outgoing claim types的地方新增一筆把Token-Groups – Unqualified Name對應到Role的紀錄
![image image](http://lh6.ggpht.com/-Yft-9U6h4aU/UHKIH_tU-EI/AAAAAAAAA1A/PVPoeII_YpI/image_thumb%25255B32%25255D.png?imgmax=800)
按確定結束設定.
到這邊基本上已經設定完成了. 接著要來測試一下剛剛的設定是不是都正確.因為還沒開始部署程式, 所以我們先來借用ACS Portal上的範例登入畫面來測試.
![image image](http://lh4.ggpht.com/-20RAB2zncwE/UHKIJv-HArI/AAAAAAAAA1Q/e2IFFDWU1iQ/image_thumb%25255B33%25255D.png?imgmax=800)
下載後會看到剛剛設定的三個識別提供者都出現在列表裡, 其中Michael Virtual Net是我們的AD整合. 點她後會跳出AD驗證的登入視窗, 輸入ID Password後, 會看到IE網址列會開始詢問pdc.michaeldns.biz以及Azure ACS網址, 最後驗證完成之後, 就會把我們導向剛剛所設定的那個不存在的網址(http://vnclient.ocm). 到這邊應該可以認定設定應該都沒有問題了, 接下來就要實際上寫個程式放到雲端上來跟AD整合了.
![image image](http://lh3.ggpht.com/-gql7AM-qntA/UHKIK0ZNLcI/AAAAAAAAA1g/3HERO-c_ybY/image_thumb%25255B34%25255D.png?imgmax=800)