Asp.net
ASP.NET 中的 ActiveDirectory 目前使用者名
我正在嘗試讓 ActiveDirectory 和標準表單登錄工作,但有一件事阻止了我。我無法獲取目前 Windows 使用者的名稱。我得到的最接近的是
var i = WindowsIdentity.GetCurrent();,但這給了我 IIS 應用程序池使用者的名稱。我在 IIS 中啟用了匿名身份驗證、表單身份驗證和 Windows 身份驗證。我可以從 AD 載入使用者,所以我假設我的 web.config 設置正確。編輯:這是我的 web.config(使用 Facade 提供程序):
<membership defaultProvider="HybridMembershipProvider"> <providers> <clear /> <add name="HybridMembershipProvider" type="MyApp.Data.HybridMembershipProvider" AspNetProviderName="AspNetSqlMembershipProvider" ActiveDirectoryProviderName="ADMembershipProvider" /> <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="MyAppConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="4" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> <add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADConnectionString" attributeMapUsername="sAMAccountName" enableSearchMethods="true" attributeMapEmail="mail"/> </providers> </membership>編輯 2:這是我的 IIS 安全設置。
如果你在 IIS 中打開 ASP.Net Impersonation,你可以得到你想要的使用者名。這僅在該數據位於成員資格提供者/AD 表單中且它們不是匿名的情況下才有效。
此外,混合基於表單和基於 Windows/AD 的身份驗證是可行的,但不推薦。如果您需要這樣做,請參閱此。
編輯:我想我誤解了你想要的,所以這裡是對上述解決方案的高級掩飾:
如果您關閉匿名身份驗證並打開 Asp.Net 模擬,IIS 將在有人訪問該站點時執行 401 質詢。
如果一切都在同一個域中,Web 瀏覽器會將您的憑據發送到 IIS,IIS 將根據其 Active Directory 驗證它們,然後 AD 將為 IIS 提供一個可以使用的身份。
當您打開 Asp.Net Impersonation 時,IIS 會將該身份綁定到目前執行緒/請求。因此,在身份驗證發生後,您可以從目前執行緒標識中獲取使用者名,然後查詢 Active Directory,如下所示:
using System.Threading; using System.DirectoryServices; using System.DirectoryServices.AccountManagement; ...... PrincipalContext pc = null; UserPrincipal principal = null; try { var username = Thread.CurrentPrincipal.Identity.Name; pc = new PrincipalContext(ContextType.Domain, "active.directory.domain.com"); principal = UserPrincipal.FindByIdentity(pc, username); var firstName = principal.GivenName ?? string.Empty var lastName = principal.Surname ?? string.Empty return string.Format("Hello {0} {1}!", firstName, lastName); } catch ... finally { if (principal != null) principal.Dispose(); if (pc != null) pc.Dispose(); }
