Asp.net

ASP.NET 中的 ActiveDirectory 目前使用者名

  • August 30, 2013

我正在嘗試讓 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 安全設置

如果你在 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();
}

引用自:https://stackoverflow.com/questions/10584545