2012-12-10 90 views
1

我正在ASP.NET和C#中開發一個網站。Windows身份驗證在服務器上不起作用

我當用戶訪問該網站創建的網站,所以,他的Windows客戶端的用戶名與讀出:

System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString(); 

,然後我查找他的用戶名在數據庫中,並創建一個用戶對象來自返回數據的所有必要數據(團隊,名稱,權限級別,角色......)。 然後我將這個對象保存在一個會話var直到用戶註銷。

這是工作就像一個魅力本地,但現在,我已經部署到服務器上,我得到defaultAppPool爲每一位用戶。

我在做什麼錯?

在我的web.config文件中我有:

authentication mode="Windows" 

我不得不承認,這是第一次,我做了部署自己,一切都進行得很順利,除了這一點。

+3

您是否還配置了IIS以使用Windows身份驗證(並禁用匿名)? –

+1

真的很抱歉,但這真是一個非常愚蠢的錯誤。 System.Security.Principal.WindowsIdentity.GetCurrent()。Name.ToString(); 需要爲 HttpContext.Current.User.Identity.Name; 這給了我正確的用戶名。 – Jelle

回答

2

正如您發現的那樣,System.Security.Principal.WindowsIdentity.GetCurrent()爲您提供了應用程序池的身份。

您應該使用HttpContext.Current.User.Identity

1

Windows身份驗證和IIS 如果您選擇適合您的ASP.NET應用程序Windows身份驗證,還需要在IIS中配置身份驗證。這是因爲Windows身份驗證被委派回IIS。 IIS爲您提供了四種身份驗證方法:

  1. 如果您選擇匿名身份驗證,IIS將不會執行任何身份驗證。任何人都可以訪問ASP.NET應用程序。
  2. 如果您選擇基本身份驗證,用戶必須提供Windows用戶名和密碼才能連接。這些信息以明文形式通過網絡發送,使得基本認證在互聯網上危險不安全。
  3. 如果您選擇摘要式身份驗證,用戶仍然必須提供Windows用戶名和密碼才能連接。但是,密碼在通過網絡發送之前被散列。摘要式身份驗證要求所有用戶都運行Internet Explorer 5或更高版本,並將Windows帳戶存儲在Active Directory中。
  4. 如果您選擇Windows集成身份驗證,則密碼不會跨網絡。用戶仍然必須擁有Windows用戶名和密碼,但使用Kerberos或質詢/響應協議來驗證用戶身份。 Windows集成身份驗證要求所有用戶都運行Internet Explorer 3.01或更高版本。
0

獲取當前用戶的身份爲:的

var userWinId = HttpContext.Current.User.Identity as WindowsIdentity; 
0

使用

System.Web.HttpContext.Current.User.Identity.Name

代替

User.Identity.Name

System.Security.Principal.WindowsIdentity.GetCurrent().Name