【问题标题】:Check user is locked in LDAP?检查用户是否被锁定在 LDAP 中?
【发布时间】:2017-01-11 19:39:49
【问题描述】:

我需要验证 LDAP 中的用户帐户是否被锁定 我正在使用下面的代码

const int ADS_UF_LOCKOUT = 0x00000010;
DirectoryEntry entry = new DirectoryEntry (_path, domainAndUsername, pwd);
if (((int)entry.Properties["useraccountcontrol"].Value & ADS_UF_LOCKOUT) == 1)
{
    return true;
}

但如果用户帐户被锁定,我会收到“登录失败:用户名/密码错误”

请帮忙。

【问题讨论】:

    标签: c# active-directory


    【解决方案1】:

    如果您想确定用户帐户是否被锁定,那么您不能使用您正在检查的用户帐户信息来确定这一事实 - 因为用户帐户被锁定,您将被拒绝访问。

    您不会被告知无法登录的原因是由于帐户被锁定,这将被视为过度信息泄露。

    如果您想确定不允许登录的原因是否是由于帐户被锁定,那么您将需要一个已经登录的帐户,该帐户可以检查帐户锁定状态,而不是从失败的连接尝试。

    【讨论】:

    【解决方案2】:

    您也可以使用属性锁定时间:如果用户未锁定,则为 0。 (使用管理员凭据连接到 AD)。

    DirectoryEntry _de = new DirectoryEntry (_path, domainAdmininstratorName, pwd); // get user as directory entry object
    object largeInteger = _de.Properties["lockoutTime"].Value; // it's a large integer so we need to get it's value by a little bit complex way
    long highPart =
                (Int32)
                    largeInteger.GetType()
                        .InvokeMember("HighPart", BindingFlags.GetProperty, null, largeInteger, null);
    long lowPart =
                (Int32)
                    largeInteger.GetType()
                        .InvokeMember("LowPart", BindingFlags.GetProperty, null, largeInteger, null);
    long result = (long) ((uint) lowPart + (((long) highPart) << 32));
    if (result == 0) 
    {
       // account is not locked
    }
    else
    {
     // account is locked
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多