更新
把这个放在最上面是因为它太疯狂了:)
所以有些用户可以使用,有些则不行。当我通过 IE7 使用我自己的帐户时,它不起作用(我的代码捕获异常并回退到简单地使用身份名称而不是 AD 全名)。当我通过 Chrome 尝试时,它会提示我输入我提供的用户名和密码,并显示全名。所以用户帐户、服务器代码和设置是相同的,但使用不同的浏览器发送身份验证是可行的。
我还清除了 IE7 中的所有 cookie,重新启动,IE 的行为没有任何变化。许多 IE7 用户都觉得它运行良好。
更新 #2
远程登录到另一台机器,转到IE7 中的页面,它显示我的全名。没有线索。我在想也许 session 正在缓存一些东西,但我已经重新发布了该应用程序并且应该清除 session 。我在想也许 cookie 有一个旧的/坏的标记,但我已经清除了那些并再次尝试。某处的东西必须得到长期缓存。希望它能自行解决。
结束更新
你好,
我正在 IIS 6.0 上运行的 ASP.NET (MVC) 应用程序中从我们的 AD 中检索用户全名。
string domainUser = filterContext.HttpContext.User.Identity.Name;
WindowsIdentity windowsIdentity = filterContext.HttpContext.User.Identity as WindowsIdentity;
WindowsImpersonationContext impersonationContext = windowsIdentity.Impersonate();
DirectoryEntry userEntry = new DirectoryEntry("WinNT://" + domainUser.Replace('\\', '/') + ",User");
filterContext.Controller.ViewData["User"] = (string)userEntry.Properties["fullname"].Value;
最后一行抛出异常:“登录失败:未知用户名或错误密码。”
如果我查看 HttpContext.User.Identity,它是一个有效的域用户并且 WindowsIdentity.GetCurrent 被正确模拟。
这个异常似乎也不会在 100% 的时间内抛出,如果从 IIS 服务器浏览也不会抛出。
我的 web.config 看起来像:
<authentication mode="Windows"/>
<authorization>
<deny users="?"/>
</authorization>
<identity impersonate="false"/>
困扰我的是,如果我删除模拟行:
WindowsImpersonationContext impersonationContext = windowsIdentity.Impersonate();
它有效。 WindowsIdentity.GetCurrent 是 NT AUTHORITY\NETWORK SERVICE,它不是域用户,但不会引发异常,并且会从 AD 中检索全名。
最后一点是,这似乎只是在应用程序的新部署(从测试到上线)中才开始发生。我不知道是我缺少 IIS 设置还是什么,但代码没有更改。
我知道我之前需要模拟才能使其正常工作,而且看起来我应该需要模拟,所以我在不完全了解发生了什么以及为什么现在出现此错误的情况下犹豫要不要删除模拟调用正在发生。
谢谢。
最佳答案
我怀疑问题是托管您的 ASP.NET 应用程序的服务器不受委托(delegate)信任。谷歌“受托委托(delegate)”了解更多信息,或 this MSDN article是一个很好的起点。
关于c# - IIS/DirectoryEntry/ASP.NET - 登录失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1059005/