无法在生产服务器上访问用户Active Directory密码信息

时间:2012-06-07 16:48:37

标签: asp.net asp.net-mvc active-directory ldap

我正在开发一个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);

    }

我是域名的管理员,所以我认为我有应用程序权限问题,但由于失败的应用程序具有与工作应用程序相同的权限,我不确定下一步要查看的位置。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

我正在回答我自己的问题,因为我想发布有效的代码。当询问WindowsIdentity.GetCurrent()。Name是否应用于应用程序池的标识而不是登录用户时,Wiktor Zychla将其命名为n。事实上它确实如此,感谢Wiktor!

以下是修改后的代码。我确实改变了获得用户身份的方式(解释了下面的原因)。

控制器代码:

using MyProject.Utilities;  // Folder where I created the CommonFunctions.cs Class

var cf = new CommonFunctions();
string user = User.Identity.Name;
ViewBag.PasswordExpires = cf.GetPasswordExpiration(user);

CommonFunctions中的代码

public int GetPasswordExpiration(string user)
    {
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
        UserPrincipal currLogin = UserPrincipal.FindByIdentity(ctx, user);
        DateTime passwordLastSet = currLogin.LastPasswordSet.Value;
        int doyPasswordSet = passwordLastSet.DayOfYear;
        int doy = DateTime.Today.DayOfYear;
        int daysSinceLastset = (doy - doyPasswordSet);
        int daysTilDue = (120 - daysSinceLastset);
        return (daysTilDue);

    }

让我明白的一件事是,我决定只运行我控制器中的所有代码,当我这样做时,我得到了一个红色的波浪形的说法“在这种情况下,WindowsIdentity的名称不存在”:

string currUserName = WindowsIdentity .GetCurrent()。Name;

另外,我在Controller中检索User.Identity.Name并将其传递给函数的原因是因为一旦我开始工作并希望将控制器稀疏,我试图在函数中获取User.Identity.Name但是我在这一行的User下面有另一个红色波浪形的相同消息:  string user = User.Identity.Name; 所以我认为这是一个.net的东西,只是在控制器中获取User.Identiy.Name,将其传递给函数,一切都很好。这个确实考验了我的耐心,我希望这篇文章可以帮助别人。