【问题标题】:Active Directory authentication via LDAP with user@mydomain.com using Delphi使用 Delphi 通过 LDAP 与 user@mydomain.com 进行 Active Directory 身份验证
【发布时间】:2014-11-25 19:44:36
【问题描述】:

从下面的代码 sn-p 可以看出。我目前正在使用 adshlp 和 ActiveDs_TLB 从当前登录的用户那里收集有关 AD 的信息。我有一个表单,允许用户输入他们的 AD 密码,我在允许访问系统之前验证它是正确的。这炒得很好。我现在遇到的问题是用户希望能够以 mydomain.com\userid 的形式输入任何 AD 和 ID,并让代码进行身份验证并带回代码当前检索到的相同数据。我还没有找到可以做到这一点的 LDAP 调用。如果能得到任何帮助和建议,我将不胜感激。 谢谢

uses
adshlp, ActiveDs_TLB


function Tlogon_form.GetUser(Domain, UserName, pword: string; var ADSIUser: TADSIUserInfo): boolean;
var
  usr   :    IAdsUser;
  usr1  :    IADs;
  flags :    integer;
  grps  :    IAdsMembers;
  grp   :    IAdsGroup;
  varGroup : OleVariant;
  Temp :     LongWord;
  pwd, cn_name, FQDN, AD_path: string;
  HR : boolean;
  fad_domain:string;
  objsysinfo: IADsADSystemInfo;
  domainDN: string;
  List: array [0..10] of String;
  I: integer;
  name_nodes :string;

const
  ADS_SECURE_AUTHENTICATION = $00000001;
begin
  ADSIUser.UID:='';
  ADSIUser.UserName:='';
  ADSIUser.DB_login :='';
  ADSIUser.Disabled:=true;
  ADSIUser.LockedOut:=true;
  ADSIUser.Groups:='';
  Result:=false;
  FQDN :='';
  AD_path := '';
  SBN_SQL.Common_login :='';

  FPassword := pword;
  FUserName := UserName;
  //FDomain := lowercase(Domain); // + '.local';

  if FUserName = '' then exit;

  objsysinfo := CoADSystemInfo.Create;
  domainDN := objsysinfo.GetAnyDCName;
  fad_domain := objsysinfo.DomainDNSName;
  name_nodes := objsysinfo.UserName;

  if domain > '' then
  begin
    fad_domain := domain;
  end
  else
  begin
    domain := fad_domain;
  end;

  fad_domain := fad_domain + '.';

  FQDN := domainDN;
  ad_path := name_nodes;

    try
     if trim(FUserName)<>'' then
     begin
        ADsOpenObject('LDAP://' + AD_path, FUserName, FPassword,ADS_SECURE_AUTHENTICATION, IADsUser, usr);
     end;

     if usr=nil then exit;

     ADSIUser.UID:= UserName;

     ADSIUser.UserName := usr.FullName;
     ADSIUser.DB_login := usr.employeeid;
     //usr:=nil;
     Result:=true;
     exit;
  except
     on e: exception do begin
        Result:=false;
        exit;
     end;
  end;


end;

【问题讨论】:

    标签: delphi active-directory ldap


    【解决方案1】:

    可以做的是根据userid(没有域)搜索该用户,从而获取相关信息。

    早在 2000 年 10 月,我就在“The Delphi Magazine”上写了一篇关于使用 ADSI 和 Delphi 进行搜索的文章 - 您仍然可以下载我的 code sample and a Delphi component TADSISearcher from my web site - 希望这可以帮助您入门!

    【讨论】:

    • 感谢您的回复。那是我开始这个项目时首先阅读的网页之一。我发现它很有帮助,但没有在那里找到我的答案。
    • @WisnuWidiarta: 网站在此期间已停产 - 请尝试使用此链接:1drv.ms/u/s!AtQ29cmdYW3QgVb7mBsPVTpss3fb?e=8kkOgN
    • 谢谢马克!我会试试。如果您有任何我应该阅读的有关 Active Directory 的网址(以便我可以正确使用该组件),我们将不胜感激。
    • 嗨 Marc.. 我收到一个错误:找不到:ActiveDs_TLB(我使用的是 D2010 和 Rio)。有什么建议吗?我可以从github.com/mitshel/tech-inv-2012/blob/master/ADOLogin/… 得到它吗?
    【解决方案2】:

    我还使用 ADsOpenObject 进行 LDAP 验证,并且在您的代码中您将域作为参数传递,因此在 ADsOpenObject 调用中使用此类参数,或者我可能没有清楚理解问题

    function Authenticate(const pUser, pPassword,pDomain: String): HRESULT;  
    Var  
     aUser : IAdsUser;  
    begin  
     Try  
       Result  := ADsOpenObject(Format('LDAP://%s',[pDomain]),Format('%s\%s',[pDomain,pUser]),pPassword,ADS_SECURE_AUTHENTICATION,IAdsUser,aUser);    
      // here retrieve the information needed   
     Finally  
       aUser := Nil  
     End  
    end;  
    

    【讨论】:

    • 除了奇怪地使用try..finally 块并将输入字符串参数设置为nil,还有关于ADsOpenObject 函数的另一件事。 MSDN 明确表示“此功能不应仅用于验证用户凭据。”.
    • 我试过这个,我收到“不支持这样的接口”。我切换到调用组合:ADsOpenObject('WinNT://' + domain + '/' + FUserName, FUserName, FPassword,ADS_SECURE_AUTHENTICATION, IADsUser, usr); cn_name := usr.FullName;
    • ADsOpenObject('LDAP://CN=' + cn_name + ',' + AD_path, FUserName, FPassword,ADS_SECURE_AUTHENTICATION, IADsUser, usr);这允许我覆盖原始 AD 并指向另一个,但由于他们配置 AD 的方式,它对我的​​客户不起作用。
    猜你喜欢
    • 1970-01-01
    • 2020-02-16
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 2011-12-04
    相关资源
    最近更新 更多