照著Rainbow Portal 2.0 NTLM 網域整合Hack修改後,遇到要利用AD群組時,找不到舊版選擇Windows 群組的選項。
在MSDN上ADSI的範例,.Net 1.1和.Net 2.0/3.5也略有不同,而我測試結果是.Net 2.0版本才可正常運行。我自己的情況是在Projects\Rainbow.Framework.Core\Helpers\ADHelper.cs裏的 public static string[] GetUserGroups(string UserAccount) 沒有傳回group資料,因此這裏利用MSDN的範例寫一個簡易版,若能正確執行就不必自己改。
改到這裏已經可以利用AD控制授權,接下來就得想辦法把舊版的Rainbow Portal升級。
Update: VB超人提供VB6.0列舉AD群組的方法,請看這。
在MSDN上ADSI的範例,.Net 1.1和.Net 2.0/3.5也略有不同,而我測試結果是.Net 2.0版本才可正常運行。我自己的情況是在Projects\Rainbow.Framework.Core\Helpers\ADHelper.cs裏的 public static string[] GetUserGroups(string UserAccount) 沒有傳回group資料,因此這裏利用MSDN的範例寫一個簡易版,若能正確執行就不必自己改。
public static ArrayList getUserGroups(string userid) // userid是去掉DOMAIN的user account
{
string path = Config.ADdns;
ArrayList ret = new ArrayList();
ret.Add("Authenticated Users");
ret.Add("All Users");
DirectoryEntry entry =
new System.DirectoryServices.DirectoryEntry(path);
System.DirectoryServices.DirectorySearcher mySearcher = new
System.DirectoryServices.DirectorySearcher(entry);
mySearcher.Filter = "(anr=" + userid + ")";
try {
foreach (System.DirectoryServices.SearchResult result in
mySearcher.FindAll()) {
DirectoryEntry oUser;
oUser = new DirectoryEntry(result.GetDirectoryEntry().Path);
object groups = oUser.Invoke("Groups");
foreach (object group in (IEnumerable)groups) {
DirectoryEntry groupEntry = new DirectoryEntry(group);
ret.Add(groupEntry.Name.Substring(groupEntry.Name.LastIndexOf("CN=") + 3));
} } }
catch (Exception) { }
return ret;
}
再修改Projects\Rainbow.Framework.Core\Security\Security.cs的 public static bool IsInRole(string role) ,令其正確判斷user是否為正確的群組。由於找不到AD群組,因此改成在SQL找到同名的Role時一樣有效,這樣也是另類的整合認證。改到這裏已經可以利用AD控制授權,接下來就得想辦法把舊版的Rainbow Portal升級。
Update: VB超人提供VB6.0列舉AD群組的方法,請看這。
留言