2011-05-02 5 views
2

OpenLDAP를 supportedControl 이 컨트롤에 의해.OpenLDAP를 supportedControl 암호 정책

Cygwin 환경에서 로컬로 빌드/실행되는 최신 Openldap 소스를 사용하고 있으며 빌드에서 PPolicy 관련 구성을 모두 활성화하고 PPolicy를 구성 및 작동/테스트했습니다. 디렉토리 서비스 프로그래밍 가이드에서, 링크 예를 수정하여

다음

암호 정책을 요청하도록 구성된 DirectoryControl로 채워진 SearchRequest에를 사용하는 http://dunnry.com/blog/2006/05/11/DotNetDevGuideToDirectoryServicesCompanionSiteLaunched.aspx

는 나에게 아무 것도 얻을 수 없습니다. 모든 서버 소스에 잘 보이는 : http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob_plain;f=servers/slapd/overlays/ppolicy.c;hb=HEAD

사람이 SearchRequest에에서 닷넷 DirectoryControls를 사용하여 운이 있었나요? 난 당신과 같은 문제가 있었다 및 실패 많은 것들을 시도하고 시간이 부족

_authConnect.AuthType = AuthType.Basic; 
// credentials.UserName is a user DN format, w/password and null domain 
_authConnect.Credential = credentials; 
Debug.WriteLine("PV: " + _authConnect.SessionOptions.ProtocolVersion); 

var sr = //new ExtendedRequest(); 
     new SearchRequest(credentials.UserName, "(objectclass=*)", SearchScope.Base, null); 
     //new DsmlAuthRequest(credentials.UserName); 
     var isCritical = false; 
    var ppolicy = "1.3.6.1.4.1.42.2.27.8.5.1"; 
     // ppolicy request and response control is referred to by the same OID 
     sr.Controls.Add(new DirectoryControl(ppolicy, null, isCritical, true)); 
    sr.Controls.Add(new DirectoryControl(ppolicy, new byte[8], isCritical, false)); 

try 
{ 
    var response = (SearchResponse)_authConnect.SendRequest(sr); 
    DirectoryControl[] c = response.Controls; 
    if (c.Rank > 0 && c.GetLength(0) > 0) 
    { 
    Debug.WriteLine(c[0].Type + " value: " + c[0].GetValue()); 
    } 
    SearchResultEntry entry = response.Entries[0]; 
    c = entry.Controls; 
    if (c.Rank > 0 && c.GetLength(0) > 0) 
    { 
    Debug.WriteLine(c[0].Type + " value: " + c[0].GetValue()); 
    } 
    return true; 
} 
catch (LdapException ex) 
{ 
    Debug.WriteLine(ex.Message); 
} 
+0

권한 상태 (바인드 포함)를 설정하는 데 사용하는 인증 ID가 해당 요청 컨트롤을 사용하도록 허용되었는지 확인 했습니까? –

+0

'slapd -d -1'의 출력에 아무것도 나타나지 않습니다. 권한 문제가 있음을 나타냅니다. – ticktock

+0

디렉토리 서버 로그는 권한 상태에 해당 컨트롤을 사용할 수있는 권한이 없기 때문에 요청이 실패했음을 나타냅니다. BTW, 요청에 응답 컨트롤 OID를 포함하지 마십시오. 응답 컨트롤이 있으면 서버의 응답에 표시됩니다. –

답변

0

: 여기

내가하려고했는데 일부 코드입니다. 문제는 openldap이 바인드 요청에 암호 만료 정보 만 보내고 있다는 것입니다. 서버에서 모든 로깅을 사용 가능하게하여이 사실을 발견했습니다. 그래서 바인드 요청으로 디렉토리 컨트롤을 사용하는 방법을 찾으려고 노력했습니다. 찾을 수있는 S.DS.P LdapConnection 클래스를 사용하여 수행 할 수있는 방법이 없습니다. 그런 다음 연결 객체에 반영하고 ldaphandle 변수를 잡아서 해킹을 시도했습니다. 그것으로 나는 S.DS.P가 직접하는 것처럼 c-api를 직접 호출 할 수 있습니다. openldap 소스를 둘러 보았고 그 도구가 메커니즘없이 sasl 바인드 메커니즘을 사용한다는 사실을 알게되었습니다.이 메커니즘은 라이브러리에서 컨트롤과 간단히 바인드됩니다. 그것은 winldap에서 똑같이 작동하지 않습니다. 그렇게하면 잘못된 매개 변수 응답 코드가 반환됩니다. 마지막으로 시도한 것은 ldap_bind의 비동기 버전을 호출하고 메시지를 다시 읽는 것입니다. 불행히도 아무런 통제가 없었습니다. 나는 그들이 openldap 로그 파일이 경고를 설정하고있다하더라도 반환하지 않았기 때문에 나는 그들을 보내지 않았다고 생각한다. 이것이 내장 된 winldap 바인드 메소드를 사용하기위한 유일한 희망이었습니다.

마지막으로 시도 할 것이지만 시간이 없으면 컨트롤로 내 자신의 바인드 메시지를 만들고 ldap_extended_operation_s 함수를 사용하여 서버로 보냅니다. http://msdn.microsoft.com/en-us/library/aa366580(v=VS.85).aspx이 프로젝트에서 좀 더 시간을 할애하면 돌아가서 시도해 볼 수 있습니다. 내가하면 여기서 다시보고 할게. 궁극적으로 이것이 해결책이라면 Novell의 ldapcsharp 라이브러리를 사용하는 것이 더 쉽습니다. 그것을 사용하여 서버 컨트롤과 바인딩 요청을 보낼 수있는 것 같습니다. 필자는 다소 익숙하고 이미 DirectoryServices.Protocols를 이미 사용하고 있기 때문에 winldap API 만 살펴 보았습니다.

+0

바인드 요청에서 암호 만료 정보도 보았습니다.나는 그것이 PAM 모듈 + slapd-search에 의해 만들어진 auth 요청으로 되돌아 간다고 믿는다. 필자는 Windows 용 PAM 모듈을 사용하는 방법에 대해 간략히 살펴 보았지만 이것이 IMO가 아닌 최상의 솔루션입니다. 오늘날 우리는 방침을 요구하고 모든 계산을 스스로하고 있습니다. Openldap Controls에 많은 도움이됩니다! 나는 그들 중 누구도 일할 수 없었습니다. 문제는 Openldap에 있다고 생각합니다. Openldap 소스에서 버그 픽스를 살펴 보겠습니다. – ticktock