ASP.NET 網站如何取得使用者登入的 AD 帳號
類似的問題被問到好幾次了,今天一併整理一下
Q1、如何在環境開發環境可以做到 AD 認證?
在啟用虛擬的 IIS 就會直接用 AD 的帳號來進行驗證
Q2、如何取得 AD 帳號?
一種是用 WindowsIdentity.GetCurrent
另外一種是用 HttpContext.Current.User
若都是在開發環境的話,基本上大家看起來的效果都一樣!
但!若是用第一種方法,佈署到 IIS 上的話
都會取得到的是 ASP.NET vX.0 的帳號,因為在 IIS 上都是用此帳號在執行的
PS.. 若是要用自已的帳號去跑報表或是做其他事情的話,那就要用 WindowsIdentity.Impersonate 了
用方法二的方式佈署至 IIS 並且用其他帳號登入電腦
可以看到都有正確抓到指定的帳號
Q3、佈署後出現 401 未經授權?
這裡是用 IIS 7.5 的設定
點選 驗證項目
記得要將 Windows 驗證開啟
補充:「匿名驗證」也是要關掉的!若是 Windows 和 匿名 同時開啟的話!會找不到 AD 登入帳號的喔!
Q4、Java 是否可以像 ASP.NET 直接在 IIS Server 也能抓取登入的 AD 帳號?
不行!因為Java 本身 並沒有提供 整合 IIS 的機制
基本上 ASP.NET 是透過 IIS 的 Windows 認證機制並且由 Server 取得 Token
所以大部分 Java 都是透過 ActiveX 元件取得本機的 AD 帳號
而這個方式會有資安的問題,在 Server 端也沒有辦法確認是否真的是用該帳號登入
若是 Java 要在 Server 取得 AD 帳號,就要看該 App Server Host 是否有支援 AD 並提供相對應的 API
感謝 Phoneix 提供 Apache 2.x 以上的可以做到 … 但若不是的話可能還是要硬幹了
Q5、SharePoint Server 是否也可以用同樣的方式?
是的!也是用同樣的方式來處理
參考資料
WindowsIdentity 類別
http://msdn.microsoft.com/zh-tw/library/system.security.principal.windowsidentity.aspx
Recipe: Enabling Windows Authentication within an Intranet ASP.NET Web application
Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication
http://msdn.microsoft.com/en-us/library/aa302377.aspx
ASP.NET透過AD進行驗證 #3 --WindowsIdentity 類別,一個怪怪的範例與程式
如何在 ASP.NET 應用程式中實作模擬