我们试图通过Microsoft验证使用dbms_ldap的应用程序用户,而且我们没有办法在我们的离岸环境中测试它。
我们有三个具体问题
1)如何验证用户是否存在于Microsoft活动目录中。
我们使用下面的代码获取应用程序用户的显著名称
DBMS_LDAP.USE_EXCEPTION := FALSE;
retval := DBMS_LDAP.search_s(ld => ldapSession,
base => LDAP_BASE,
scope => DBMS_LDAP.SCOPE_SUBTREE,
filter => '(&(objectclass=USER)(SAMAccountName=' ||
p_username || '))',
attrs => attrList,
attronly => 0,
res => ldapMessage);
-- get the DN
if retval <> DBMS_LDAP_UTL.SUCCESS THEN
RAISE l_ldap_exception;
END IF;
userDN := DBMS_LDAP.get_dn(ldapSession, ldapMessage);
所以第一个问题是,
userDN and ldapMessage
如果用户不存在于Microsoft中
2)假设用户存在并输入了错误的密码,那么retval的返回值是多少?
if p_password is null then
raise_application_error(-20000, 'Invalid Null password');
else
retval := DBMS_LDAP.simple_bind_s(ldapSession,userDN, p_password);
end if;
if retval <> DBMS_LDAP_UTL.SUCCESS THEN
RAISE l_ldap_exception;
and if;
3)我的第三个问题是,假设用户已经登录了系统,而ldapsession仍然没有解除绑定,那么识别重复会话的方法是什么?
发布于 2014-08-25 12:35:41
首先,读读文档。它几乎包含了回答问题所需的一切:ref.htm
1)将引发NULL或get_dn_exception,我不确定。无论如何,另一种检查方法是计数搜索结果,您只需要检查计数是否>0:
DBMS_LDAP.count_entries(ld => ldapSession, msg => ldapMessage)
2) retval只能是DMBS_LDAP.SUCCESS,任何错误都会引发异常
3)如果您有会话id,请调用任何需要有效LDAP会话的过程,例如simple_bind_s,并检查是否引发了invalid_session。如果您没有会话id,我不知道有什么方法可以确定是否有LDAP会话处于打开状态。
发布于 2016-03-18 02:04:58
在我的申请中,我这样做:
ld := DBMS_LDAP.INIT(LDAP_SERVER, 389);
retval := DBMS_LDAP.SIMPLE_BIND_S(ld, LDAP_USER, LDAP_PASSWORD);
DBMS_LDAP.USE_EXCEPTION := FALSE;
retval := DBMS_LDAP.SEARCH_S(
ld => ld,
base => LDAP_BASE,
SCOPE => DBMS_LDAP.SCOPE_SUBTREE,
FILTER => '&(objectCategory=user)(sAMAccountName='||username ||')',
attrs => attrs,
attronly => 0,
res => ldapMessage);
retval := DBMS_LDAP.COUNT_ENTRIES(ld, ldapMessage);
ldapEntry := DBMS_LDAP.FIRST_ENTRY(ld, ldapMessage);
IF ldapEntry IS NULL THEN
retval := DBMS_LDAP.MSGFREE(ldapMessage);
retval := DBMS_LDAP.UNBIND_S(ld);
RAISE_APPLICATION_ERROR(-20001, 'User does not exist');
ELSE
userDN := DBMS_LDAP.GET_DN(ld, ldapEntry);
END IF;
retval := DBMS_LDAP.MSGFREE(ldapMessage);
IF p_password IS NULL THEN
retval := DBMS_LDAP.UNBIND_S(ld);
RAISE_APPLICATION_ERROR(-20000, 'Invalid Null password');
ELSE
retval := DBMS_LDAP.SIMPLE_BIND_S(ldapSession, userDN, p_password);
IF retval <> DBMS_LDAP_UTL.SUCCESS THEN
retval := DBMS_LDAP.UNBIND_S(ld);
RAISE_APPLICATION_ERROR(-20001, 'Wrong password');
END IF;
END IF;
retval := DBMS_LDAP.UNBIND_S(ld);
关于你的问题:
1)如何验证用户是否存在于Microsoft活动目录中。
看我的代码
所以第一个问题是
userDN
和ldapMessage
的价值是什么?
userDN
是空的,ldapMessage
我不在乎。
2)假设用户存在并输入了错误的密码,那么retval的返回值是多少?
DBMS_LDAP.SUCCESS
(0)DBMS_LDAP.INVALID_CREDENTIALS
(49)注意,只有在设置DBMS_LDAP.INVALID_CREDENTIALS
时才会得到DBMS_LDAP.USE_EXCEPTION := FALSE;
,否则如果密码错误,就会得到异常。
3)我的第三个问题是,假设用户已经登录了系统,而ldapsession仍然没有解除绑定,那么识别重复会话的方法是什么?
确保在代码中正确调用DBMS_LDAP.UNBIND_S(ld);
。
另一个警告:
当您在DBMS_LDAP.SIMPLE_BIND_S(ldapSession, userDN, p_password);
提供错误的密码时,Active中的badPwdCount
属性是,而不是。因此,您可以进行无限次尝试输入(或蛮力)密码。
https://stackoverflow.com/questions/25422033
复制