ASP.NET 網站如何取得使用者登入的 AD 帳號 v2

ASP.NET 網站如何取得使用者登入的 AD 帳號

類似的問題被問到好幾次了,今天一併整理一下

 

Q1、如何在環境開發環境可以做到 AD 認證?

image

在啟用虛擬的 IIS 就會直接用 AD 的帳號來進行驗證

 

Q2、如何取得 AD 帳號?

 

image

一種是用 WindowsIdentity.GetCurrent

 

image

另外一種是用 HttpContext.Current.User

 

若都是在開發環境的話,基本上大家看起來的效果都一樣!

image

 

但!若是用第一種方法,佈署到 IIS 上的話

image

都會取得到的是 ASP.NET vX.0 的帳號,因為在 IIS 上都是用此帳號在執行的

PS.. 若是要用自已的帳號去跑報表或是做其他事情的話,那就要用 WindowsIdentity.Impersonate 了

 

 

用方法二的方式佈署至 IIS 並且用其他帳號登入電腦

image

可以看到都有正確抓到指定的帳號

 

 

 

Q3、佈署後出現 401 未經授權?

image

 

這裡是用 IIS 7.5 的設定

image

點選 驗證項目

image

記得要將 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

http://weblogs.asp.net/scottgu/archive/2006/07/12/Recipe_3A00_-Enabling-Windows-Authentication-within-an-Intranet-ASP.NET-Web-application.aspx

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 應用程式中實作模擬

http://support.microsoft.com/kb/306158