IIS / DirectoryEntry / ASP.NET - 登录失败

时间:2009-06-29 15:43:50

标签: c# asp.net iis active-directory iis-6

更新

把它放在首位,因为它很疯狂:)

因此有些用户可以使用它,有些则没有。当我通过IE7使用我自己的帐户时,它不起作用(我的代码捕获异常并回退到简单地使用身份名称而不是AD全名)。当我通过Chrome尝试时,它会提示我输入用户名和密码,并显示全名。因此,用户帐户,服务器代码和设置是相同的,但使用不同的浏览器发送身份验证使其正常工作。

我还清除了IE7中的所有cookie,重新启动,并且IE的行为没有变化。 IE7的大量用户正在使用它。

更新#2

远程登录到另一台计算机,转到IE7中的页面,它显示我的全名。没有线索。我想也许会话缓存了一些东西,但我重新发布了应用程序,应该清除会话。我想也许一个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设置或什么,但代码没有改变。

我知道我之前需要冒充它才能使它工作,而且似乎我需要冒充,所以我犹豫是否在没有完全知道发生了什么以及为什么现在这个错误的情况下删除了模拟调用发生。

感谢。

1 个答案:

答案 0 :(得分:1)

我怀疑问题在于托管ASP.NET应用程序的服务器不受委托信任。谷歌“信任委托”以获取更多信息,或this MSDN article是一个很好的起点。