【发布时间】:2012-06-07 16:48:37
【问题描述】:
我正在开发一个 MVC 应用程序,我有一个获取当前登录用户密码信息的例程,它在我的 PC 上运行良好,但是当我将我的应用程序发布到域上的实时服务器时,我似乎没有能够访问 AD 信息。我在当前运行的 asp.net web 应用程序中使用了非常相似的代码,它工作得很好。我比较了两个应用程序的安全设置,它们看起来相同。这是例程:
public int GetPasswordExpiration()
{
PrincipalContext domain = new PrincipalContext(ContextType.Domain);
string currUserName = WindowsIdentity.GetCurrent().Name;
UserPrincipal currLogin = UserPrincipal.FindByIdentity(domain, currUserName);
DateTime passwordLastSet = currLogin.LastPasswordSet.Value; //here is where it chokes***
int doyPasswordSet = passwordLastSet.DayOfYear;
int doy = DateTime.Today.DayOfYear;
int daysSinceLastset = (doy - doyPasswordSet);
int daysTilDue = (120 - daysSinceLastset);
return (daysTilDue);
}
我是域的管理员,所以我认为我遇到了应用程序权限问题,但由于失败的应用程序与工作应用程序具有相同的权限,我不确定下一步该去哪里。任何帮助表示赞赏。
【问题讨论】:
-
如果您在生产服务器上,这个
WindowsIdentity.GetCurrent().Name是否适用于您的 IIS 应用程序池的标识?您是否检查过该池是使用域帐户还是本地应用程序池身份? -
返回用户密码信息的应用程序和问题应用程序都使用同一个池。
-
您可以使用
UserPrincipal currLogin = UserPrincipal.Current并完成它... -
好的,我更改了代码,但现在出现了这个异常:`无法将类型为“System.DirectoryServices.AccountManagement.GroupPrincipal”的对象转换为类型“System.DirectoryServices.AccountManagement.UserPrincipal” .同样,它可以在我的本地机器上运行,但不能在生产服务器上运行。
-
我对 System.DirectoryServices.AccountManagement 的个人经验表明它不是很健壮,并且在不可预知的情况下很容易在简单的任务上失败。我并不是说这是一个永久的解决方案,但是您是否尝试过使用不太友好的功能相同的 DirectoryEntry 来查询此属性?如果这也不起作用,那么它似乎意味着一个明确的权限问题。
标签: asp.net asp.net-mvc active-directory ldap