讓校內的 Windows Server 2016 AD 帳號的密碼與臺中市雲端校務系統的密碼同步

URL Link //n.sfs.tw/12846

2018-10-23 23:37:27 By 杜子

臺中市的校務雲端系統釋出 rest 服務,可以直接利用 Call API 方式把帳號的密碼改掉, 方便校內帳號改密碼時可以與之同步, 我覺得這個蠻重要的, 否則學校老師又要多記一組帳號密碼, 基本上,本校所有系統都是跑 LDAP 帳號密碼,學校老師已經習慣一組帳號在校內通行無阻。

 

廢話不多說, 底下是實作過程。不過, 有個基本原則, 就是在校內的帳號代碼, 必須和雲端校務系統是一樣的才行。

原理說明

前一篇文章說明了如何讓 AD 中的  IIS 支援 PHP , 原因是希望可以

「利用 PHP 程式連線 AD 的 LDAP , 然後使用者在 WEB  界面輸入他要改的密碼,
接著, 程式把 LDAP 密碼改好後, 呼叫雲端校務系統的 API , 把同名帳號的密碼一併更改.」

以上, 是最理想的結果, 在實務上, 我花了好幾天的時間, 發現做不起來, 理由是: AD  不予許未加密的連線變更使用者密碼,
所以, 我必須想辦法讓 PHP 與 AD  進行 LDAPS 連線, 也就是跑 port 636 , 但實在太複雜了 ( 或許是自己太無知, 不會設定)
總之, 弄了好久, 只達成可以 ldap_connect , 但卻無法 bind 使用者, 所以最後宣告放棄。

現在的做法是:

1. 寫一支PHP程式,利用LDAP Bind 方式驗證使用者的LDAP帳密,帳密對了才進行外部呼叫

2. 在 AD 這邊準備一支 ASP.NET 程式讓 PHP程式呼叫,變更使用者在 AD 的密碼

3. AD密碼變更成功則呼叫雲端校務系統API改校務系統的密碼

 

準備工作

1. 校務雲端主機上必須先設定 API , 如下圖操作

接下來, 名稱自訂, 但是類型要選「校內伺服器」

設完之後, 會得到一筆資料, 如下圖, 按下查看, 可以看到這個 API 的 id 和 password , 稍後會用到

 

2. 校內的 Windows Server 2016 要確認 IIS 是可以執行  .aspx 程式的 , 相關設定, 在此不贅述了.

3. 準備一部可執行 PHP 的 Server , 要安裝 Curl 的 extension 套件。這個可直接裝在 Window AD 上,讓 IIS 能執行 PHP 即可, 要讓 Windows AD 的 IIS 能支援 PHP , 請參考前篇作品 https://n.sfs.tw/content/index/12843

 

實作方法

1. 先下載我寫好的程式 passwd.zip 解開後應該會有兩支程式,

2. 把 rest_change_passwd.aspx 放在 IIS 的置放網頁的任一目錄, 然後確認你可以用網頁瀏覽這支程式.
( IIS 正常的話, 網頁根目錄是位於 C:\inetpub\wwwroot )

如上圖, 我是放在 C:\inetpub\wwwroot\passwd 裡, 直接瀏覽, 正常的話會顯示 -1

3. 找一台可執行  PHP 的 Server , 把 sync_password.php 這支程式擺進去, 要確認網頁可瀏覽。

 因為上次研究  LDAP 已讓 IIS可跑 PHP 了, 所以我是直接把這支 PHP 也和 rest_change_passwd.aspx 放在一起。 

4. 用文字編輯器開啟 sync_password.php , 修改裡面的一些預設變數的設定值. 如下圖, 通常是只要改這 5 個地方就可以了.

簡單說明一下好了

/* 校內 Windows AD 主機的資訊 */
//LDAP server 的 IP
$LDAP_IP="163.17.xx.xx";    <-- 這裡就是改成你的 AD 的 IP
//LDAP server 的 PORT
$LDAP_port=389;  <-- 這裡通常不用改
//Windows AD LDAP 帳號的後綴字
$Base_suffix="fnjh.tc.edu.tw";  <-- 這裡就是指你的 AD 的網域啦! 我學校的是 fnjh.tc.edu.tw
//Windows AD 上的對應 ASP 程式 URL
$rest_chpasswd_url="http://163.17.43.18/passwd/rest_change_passwd.aspx"; <-- 這裡就是剛剛測試會出現 -1 的那個網址

/* 雲端校務主機的 API 資訊 */
// 更改為學校的 API ID
$client_id = 'b5fb78c7d9c0487fd25f97xxxxxxxxxxxxxx';   <-- 這裡是雲端校務主機上申請的 API 的 id, 去 https://school.tc.edu.tw/
// 更改為學校的 API 密碼
$client_secret = 'a46105cc9b492e63079xxxxxxxxxxxxxx';   <-- 這裡是雲端校務主機上申請的 API 的 密碼

5. 設定完畢, 請直接用瀏覽器瀏覽 sync_password.php 這支程式。

 

後續討論

請特別注意 Windows AD 的群組原則中關於密碼的部份, 密碼規則設得太複雜, 可能會讓使用者改密碼過程非常不順。

我還遇過一個問題,使用者來問題「為什麼"後來"改密碼都會失敗?」

注意「後來」這個用詞,意思就是他改了,發現改錯了,然後就沒辦法改了。

後來我才發現,是因為有「密碼最短使用期限」的這個規則,要改為 0 天。