【发布时间】:2019-11-25 10:11:31
【问题描述】:
我有一个根据 Active Directory 对用户进行身份验证的 Intranet 应用程序。一般来说,在本地测试(即从我的开发机器使用 VS 2017)或在应用服务器中从 IIS 运行它(“Browse *:80”)时它工作正常,直到我尝试使用本地机器上的 URL 访问它。然后无论我使用什么用户 ID 来获取用户的详细信息,都不会显示任何内容。
此外,某些组中的用户可以访问此应用程序,因此应用程序会检查已登录用户的组成员身份。
这是我在 IIS 中设置它的方式以及我测试过的不同场景:
- 我将身份验证设置为“Windows 身份验证”,禁用匿名 身份验证并启用 AS.NET 模拟。这工作正常时 使用 localhost 从应用服务器运行,但尝试访问时 从我的本地机器并提供用户的用户 ID 以获取他/她 详细信息,不显示详细信息(无法从 广告)。
- 如果我启用匿名身份验证并将其设置为“应用程序池标识”(即网络服务),它会显示我的自定义 “访问被拒绝”页面,大概是因为此用户不属于 允许的组。
- 如果我启用匿名身份验证并选择“特定用户”并提供我的凭据,那么无论从应用服务器还是从我的本地计算机,一切正常,但需要注意的是:无论谁访问该站点,我的名字都会显示为登录用户。
我很困惑广告希望能得到一些提示。
更新 - 添加了获取用户信息的代码
获取用户身份的代码:
WindowsIdentity wiUser = WindowsIdentity.GetCurrent();
string sID = wiUser.Name.ToUpper();
获取用户广告信息的代码:
static string adDomain = "www.xxx.yyy.zzz";
static string adContainer = "DC=www,DC=xxx,DC=yyy,DC=zzz";
public static DataTable getUserADInfoDT(string sSearchStr)
{
DataTable dtResults = new DataTable();
dtResults.Columns.Add("ID");
dtResults.Columns.Add("FirstName");
...
dtResults.Columns.Add("Zip");
string adDomain = string.Empty;
string adContainer = string.Empty;
// create domain context
PrincipalContext adPrincipalContext = new PrincipalContext(ContextType.Domain, adDomain, adContainer);
using (adPrincipalContext)
{
// define a "query-by-example" principal
UserPrincipal qbeUser = new UserPrincipal(adPrincipalContext);
qbeUser.SamAccountName = sSearchStr.Trim().ToUpper();
// create principal searcher passing in the QBE principal
PrincipalSearcher srch = new PrincipalSearcher(qbeUser);
PrincipalSearchResult<Principal> psr = srch.FindAll();
// find all matches
foreach (var found in psr)
{
DataRow dr = dtResults.NewRow();
UserPrincipal up = (UserPrincipal)found;
DirectoryEntry de = (DirectoryEntry)up.GetUnderlyingObject();
dr["ID"] = de.Properties["SAMAccountName"].Value.ToString().ToUpper();
if (de.Properties["givenName"].Value != null)
dr["FirstName"] = de.Properties["givenName"].Value.ToString();
...
if (de.Properties["postalCode"].Value != null)
dr["Zip"] = de.Properties["postalCode"].Value.ToString();
dtResults.Rows.Add(dr);
//de.Close();
}
return dtResults;
}
}
【问题讨论】:
-
让我们忽略您描述的后两个场景,因为这显然不是您想要的。您需要启用 Windows 身份验证。您可以编辑您的问题并添加用于检查用户 ID 的代码吗?我怀疑这是你问题的根源。
-
这显示了您如何在 AD 中查找用户名。但是您从哪里获得传递给
sSearchStr参数的值?这就是我所说的重要部分。 -
编辑了以前的编辑并添加了几行如何获取用户的身份。
标签: c# active-directory iis-7.5