如何通过APEX_LDAP包使用Oracle Apex中的MEMBER_OF2功能



由于我使用LDAP将Microsoft Active Directory与Apex应用程序链接在一起,因此我试图从Active Directory检索当前登录用户的组。

文档如下:https://docs.oracle.com/cd/E59726_01/doc.50/e39149/apex_ldap.htm#AEAPI242

这是我的代码我的动态动作页面加载,我试图检索当前用户所属的所有组的VARCHAR2,并将其放在仅显示字段中:

BEGIN
:P1_NEW := APEX_LDAP.MEMBER_OF2(
p_username => v('APP_USER'),
p_pass => 'mypassword',
p_auth_base => 'DOMAIN',
p_host => 'XX.X.XXX.XX',
p_port => 389);
END;

但是当我加载页面时,出现了这个错误

Ajax调用返回服务器错误ORA-31202: DBMS_LDAP: error client/server LDAP: Invalid credentials。@ # @ 80090308: ldper: DSID-0C090439, comment: AcceptSecurityContext error, data 52e, v4563 for Execute PL/SQL Code.

我的代码有什么问题?提前感谢您的帮助。

托马斯

我认为您使用错误的API包APEX_LDAP。我在自己的环境中以不同的方式进行此操作,但我使用的是企业版:

  1. Oracle数据库版本19c
  2. Oracle Apex version 20.1
  3. Oracle Oracle Rest Data Services version 20.4

我有一个身份验证模式来登录我自己公司的LDAP服务器。该身份验证模式将替换Apex本地管理用户的默认模式。

应用程序——比;共享组件——>身份验证模式——>自定义

function fn_val_user_pwd_ldap (
p_username in varchar2,
p_password in varchar2
)
return boolean
is
l_ldap_host  varchar2(100) := 'myldaphost.com';
l_ldap_port  number        := 389 ;
begin 
if APEX_LDAP.AUTHENTICATE(
p_username =>p_username,
p_password =>p_password,
p_search_base => 'OU=Users,OU=Mycompany,DC=de,DC=com,DC=corp',
p_host => l_ldap_host,
p_port => l_ldap_port) 
then
dbms_application_info.set_action(null);
return true;
else
apex_util.set_authentication_result(p_code => 110);
apex_util.set_custom_auth_status(p_status => 'Username or password incorrect.');
dbms_application_info.set_action(null);
return false; 
end if;
end;

然后,我在相同的身份验证方法中使用一个后验证过程来检索LDAP中的组。我更喜欢这种方式,因为它在身份验证之后执行,但您也可以使用动态操作来执行。

declare
l_groups varchar2(4000);
BEGIN
l_groups := APEX_LDAP.MEMBER_OF2(
p_username => ':APP_USER',
p_pass => 'mypassword',
p_auth_base => 'OU=Users,OU=Mycompany,DC=de,DC=com,DC=corp',
p_host => 'myldaphost.com',
p_port => 389);
htp.p('Is Member of:'||l_groups);
END;

我们不使用SSL与LDAP服务器进行内部通信,因为此应用程序是内部网。所以参数p_use_ssl默认为n

正如我在你自己的问题的评论部分告诉你的那样,我认为参数p_auth_base指的是你自己的LDAP服务器的LDIF格式,而不是指AD的域名。

让我告诉你它是如何工作的。(当然,我隐藏了自己公司的敏感信息)。有时可能会发生无法将组信息获取为空的情况。我不确定这是LDAP授权问题,还是APEX包本身的问题

SQL> SET SERVEROUTPUT ON SIZE UNLIMITED ECHO ON 
DECLARE
is_ok        boolean;
l_mes        varchar2(2000);
l_val        varchar2(4000);
l_ldap_host  varchar2(100) := 'myldapserver.com';
l_ldap_port  number        := 389 ;
BEGIN
if APEX_LDAP.AUTHENTICATE(
p_username =>'X329097',
p_password =>'********',
p_search_base => 'OU=Users,OU=Mycompany,DC=****,DC=*****,DC=****,DC=corp',
p_host => l_ldap_host,
p_port => l_ldap_port ) 
then
is_ok := true;
l_mes := 'Username and Password Correct' ;
dbms_output.put_line(l_mes);
else 
l_mes := 'Username and Password Invalid' ;
dbms_output.put_line(l_mes);
end if;
if is_ok 
then 
l_val := APEX_LDAP.MEMBER_OF2(
p_username => 'X329097',
p_pass => '*********',
p_auth_base => 'OU=Users,OU=Mycompany,DC=****,DC=*****,DC=****,DC=corp',
p_host => l_ldap_host,
p_port => l_ldap_port);
dbms_output.put_line(l_val);    
end if;
END;
/
Username and Password Correct
SC_APEX_ADMIN:SC_ORACLE_ADMIN
PL/SQL procedure successfully completed.

我试图添加您的功能,我无法从我的登录页面访问我的应用程序了。我已经尝试了SQL命令,这是我得到的

DECLARE
VAL BOOLEAN;
BEGIN
IF APEX_LDAP.AUTHENTICATE(
p_username => 'thomas.tirole',
p_password => 'mypassword',
p_search_base => 'OU=Users,OU=Domain,DC=domain,DC=ch',
p_host => 'xx.x.xxx.xx',
p_port => 389
) THEN
dbms_output.put_line('AUTENTHICATED');
ELSE
DBMS_OUTPUT.PUT_LINE('NOT AUTHENTICATED');
END IF;
END;
---------------------------------------
NOT AUTHENTICATED
Statement processed.
0.00 seconds

如果我尝试在SQL命令上执行MEMBER_OF2函数,下面是我得到的:

declare
l_groups varchar2(4000);
BEGIN
l_groups := APEX_LDAP.MEMBER_OF2(
p_username => 'thomas.tirole',
p_pass => 'mypassword',
p_auth_base => 'OU=Users,OU=Domain,DC=domain,DC=ch', -- SAME WITH DOMAIN
p_host => 'xx.x.xxx.xx',
p_port => 389);
htp.p('Is Member of:'||l_groups);
END;
---------------------------------------
ORA-31202: DBMS_LDAP : Erreur client/serveur LDAP : Invalid credentials. 80090308: LdapErr: DSID-0C090439, comment: AcceptSecurityContext error, data 52e, v4563
ORA-06512: à "APEX_210100.WWV_FLOW_LDAP", ligne 508
ORA-06512: à "SYS.DBMS_SYS_ERROR", ligne 86
ORA-06512: à "SYS.DBMS_LDAP", ligne 1487
ORA-06512: à "SYS.DBMS_LDAP", ligne 79
ORA-06512: à "APEX_210100.WWV_FLOW_LDAP", ligne 85
ORA-06512: à "APEX_210100.WWV_FLOW_LDAP", ligne 172
ORA-06512: à "APEX_210100.WWV_FLOW_LDAP", ligne 214
ORA-06512: à "APEX_210100.WWV_FLOW_LDAP", ligne 235
ORA-06512: à "APEX_210100.WWV_FLOW_LDAP", ligne 464
ORA-06512: à "APEX_210100.WWV_FLOW_LDAP", ligne 523
ORA-06512: à ligne 4
ORA-06512: à "SYS.DBMS_SQL", ligne 1721

最新更新