2013-03-25 3 views
3

Server1 및 Server2의 ASP.NET 4 (4.0.30319) 응용 프로그램 풀에 배포 된 웹 폼의 코드에서 다음 C# 코드를 사용하고 있습니다.안전한 LDAP 인증 문제

PrincipalContext pc = new PrincipalContext(ContextType.Domain, "testnet.testad.org:636", "dc=testnet,dc=testad,dc=org"); 
bool validated = pc.ValidateCredentials(username, password, ContextOptions.Negotiate); 

서버 1이 실행되는 : 윈도우 서버 2003 SP2
는 ASP.NET 버전 4.0.30319

그것은 옵션에 따라 인증 30 ~ 60 초까지 걸리는 6.0
IIS.
는 (참고 : 지연없이 즉시 인증 일반 LDAP 사용)

서버 2가 실행 : 윈도우 서버 2008 SP2
은 IIS 7.0
ASP.NET 버전 4.0.30319

동일한 실행 코드는 Server1로, Server2는 거의 즉시 인증합니다.
(동일한 결과를 가진 다른 IIS 7.0 서버에 대한 코드도 시도했습니다.)

누구든지이 문제를 전에 경험해 봤습니까?
IIS 7.0 서버 대 IIS 7.0 서버에서 인증하는 다른 방법이 있습니까?
구성, 추가, 제거 등의 작업이 필요합니까?

감사합니다.

.............................................. .................................................. ..............................................

[업데이트]

ldaps 인증 요청을하는 동안 wireshark를 사용하도록 설정했습니다.
나는 636
을 통해 모든 요청을 포함하는 파일을 만든 그것은 여기 볼 수 있습니다 : Server1 636 traffic

가장 큰 차이는 사이에 발견된다 :

번호 1949 1.115583 초에서 - 제 06788 14.501754 초에 14.64297 초에서

호 6803-27.921379 초

해당 포트에서 다른 모든 트래픽을 11742 호 동일한 초 내에 발생한다.

참고 : Server2에는 대략 동일한 양의 트래픽이 있지만 모두 2 ~ 3 초 사이에 발생합니다.
은 여기에서 볼 수 있습니다 :

프로토 로컬 주소 외국인 주소 상태 PID
TCP 10.1.72.74:1761을 : 내가 로그인 할 때 Server2 636 traffic

내가 LDAPS에 대해 다음 연결에서 netstat -ano "명령을 실행 발견 10.1.72.54:636 설립 3688
TCP 10.1.72.74:1800 10.1.72.54:636 확정 3688
TCP 10.1.72.74:1825 10.1.72.54 : 636 ESTABLISHED 3688

+0

포트 389를 사용하면 인증 호출이 즉시 발생합니다. 636을 통해 연결할 때 두 서버에서 발급 한 인증서는 동일합니까? 내가 느낀 또 다른 유일한 이유는 추천 속도가 느려지는 이유는 참조 바인딩이 권한을 부여 할 때 올바르게 억제되지 않기 때문입니다. 트래픽의 소강 상태를 확인하기 위해 Server1의 인증 시도를 Wireshark 할 수 있습니까? – X3074861X

+0

@ X3074861X 예, 포트 389를 사용하면 인증 호출이 즉시 발생합니다. 나는 증명서에 대해 확신 할 수 없지만, 나의 dev 랩탑에는 특별한 인증서가 없으며, 디버깅 중에는 636 이상을 인증한다. Wireshark를 실행하고 Server1에 대한 인증 시도를했습니다. 위 결과를 636 이상의 모든 트래픽을 포함한 전체 로그 파일의 위치와 결과로 업데이트했습니다. – Baxter

+0

나는 Wireshark 로그를 살펴 보았을 것입니다. TLS 중에 트래픽이 가장 많이 걸리는 것을 보았을 것입니다. 핸드 셰이크 시퀀스. 이벤트 뷰어의 Server1에서 시스템 로그 아래에 Schannel의 경고 또는 오류가 표시됩니까? 협상 외에도 SSL 연결을 정의해야 할 수도 있습니다 : bool validated = pc.ValidateCredentials (사용자 이름, 암호, ContextOptions.Negotiate | ContextOptions.SecureSocketLayer); ' – X3074861X

답변

2

ServerFault에서 내 대답 좀보세요 ...

C : \ 문서 및 설정 \ 모든 사용자 \ 응용 프로그램 데이터 \ 마이크로 소프트 \ 암호화 \ RSA \ MachineKeys

멘션 :

이 서비스에 액세스하지 못할 수 있습니다

날짜 : 3/25/2013 시간 : 10:11:06 AM 출처 : Schannel "SSL 클라이언트 자격 증명에 액세스 할 때 치명적인 오류 이 (가) 발생했습니다. 키.

가능성이 있습니다.

+0

프로세스 모니터를 실행했고 경로별로 필터링 된 결과에 "Crypto \ RSA \ MachineKeys "를 참조하십시오. 로그인 페이지를 실행할 때 지정한 경로에 많은 액세스 거부 항목이 있음을 발견했습니다. 로그 항목을 여기에서 사용할 수 있도록 만들었습니다 : [프로세스 모니터 로그] (http://www.fullstackbusinessdesign.com/forums/ldaps/process-monitor-log.CSV) "서비스 계정"이 액세스 권한을 부여하는 계정은 무엇입니까? 그걸로? – Baxter

+0

또한 로그에는 작업이 "CreateFile"이지만 작업이 이미 적용된 폴더 및 컴퓨터 키가 있습니까? 폴더의 결과는 "이름 충돌"이며 컴퓨터 키의 결과는 "액세스가 거부되었습니다"입니다. – Baxter

+0

"NT AUTHORITY \ NETWORK SERVICE"에서 액세스가 거부되었으므로 읽기/실행 권한을 부여하십시오. – Daro

1

지원되는 SSL/TLS 버전을 확인하려면 레지스트리 키 항목을 확인하십시오. 핸드 셰이크 문제가 발생할 수있는 문제는 ... 몇 가지 관련 시나리오 컨트롤 \ SecurityProviders \ SCHANNEL \ 프로토콜

\

HKEY_LOCAL_MACHINE을 \ 시스템 \ CURRENTCONTROLSET (아래 링크에서 시나리오 5 참조)과 해상도가 읽기의 troubleshooting ssl related issues server certificate

+0

PCT 1.0, SSL 2.0, SSL 3.0, TLS 1.0과 같은 프로토콜을 발견했습니다. 나는 이것들을 가지고 무엇인가를해야합니까? 443이 넘는 https 트래픽에 문제가 없습니다. 위에서 설명한대로 636 이상의 ldaps 트래픽에 문제가 있습니다. 그러나 제공된 가이드를 따르면서 발견했습니다 : 1. 인증서에 해당 개인 키가 있습니다. 2. 오류없이 SSL 진단을 설치하고 실행했습니다. 3. 위의 질문에 netstat -ano "결과를 추가했습니다. 4.네트워크 모니터를 실행하고 동일한 간격을 보았습니다. 시간 간격을 제외하고 모두 괜찮은 것처럼 보입니까? – Baxter

+0

hmm ... another #note ... LdapSessionOptions 개체의 LdapConnection 개체와 QueryClientCertificate 속성의 ClientCertificates 속성이 모두 설정되어 있으면 ClientCertificates 속성에 지정된 인증서가 무시됩니다. 즉, SSL 인증서가 잘된 것처럼 보입니다. ldap 서버가 튀어 나오고 있습니까? –

+0

이것은 문제를 해결하거나 문제를 좁힐 수있는 좋은 곳입니다 ... http : //support.microsoft.com/kb/290483 ... 특히 방법 3 : Microsoft Internet Explorer 및 방법 사용 4 : Microsoft Platform SDK의 WebClient 샘플을 사용하면 약간 간단하지만 유용한 정보를 제공 할 수 있습니다. –

1

PrincipalContext의 방법 ValidateCredentials 방법은 기본적으로 LDAP 바인딩 작업에 대한 래퍼입니다. 이 두 가지 핵심 기사는 IADsOpenDSObject::OpenDSObjectLDAP ADsPath입니다.

SSL을 사용하고 있으므로 최대한 효율적으로 사용하려면 SSL을 사용하고 있어야합니다.

하나 이상의 ContextOptions 열거의 조합이 서버에 바인딩하는 데 사용되는 옵션 값 :이이 기능을 지원하지 않습니다처럼 ValidateCredentials 방법의 ContextOptions 인수에 대한 문서는 실제로 소리가 난다. 이 매개 변수는 SSL이 있거나없는 단순 바인딩 또는 바인딩 협상 만 지정할 수 있습니다.

제가 설명서를 잘못 해석하고있어 및 ValidateCredentials 방법은 정말 지원이 Negotiate | SecureSocketLayer 지정 않는다고 가정 할 때, 당신은 당신이 이름을 보내는 방법에 대해 살펴해야합니다. OpenDSObject 기사에서는 사용자 이름의 형식에 대한이 조언을 제공 :

  1. 사용자 계정의 이름과 같은 "jeffsmith : 다음 문자열 중 하나로서 lpszUserName에 통과 할 수

    ". 사용자 이름을 단독으로 사용하려면 lnReserved 매개 변수에 ADS_SECURE_AUTHENTICATION 플래그 만 설정해야합니다.

  2. "Fabrikam \ jeffsmith"와 같은 이전 버전의 Windows NT에서 사용자 경로.

  3. "CN = Jeff Smith, OU = Sales, DC = Fabrikam, DC = Com"과 같은 고유 이름. DN을 사용하려면 lnReserved 매개 변수가 0이어야합니다. 그렇지 않으면 ADS_USE_SSL 플래그가 포함되어야합니다.

  4. "[email protected]"과 같은 UPN (User Principal Name). UPN을 사용하려면 대상 사용자 개체의 userPrincipalName 특성에 적절한 UPN 값을 할당해야합니다. 당신이 2, 3 또는 4

    P.S.를 사용하는 그래서

당신은 SSL 플래그를 설정하는 예제 코드에서는 생성자에서 도메인의 DNS 이름을 지정합니다. 실제 코드로 서버를 지정하려면 ServerBind 플래그를 추가해야합니다.

+0

내가 사용하고있는 코드는 세 개의 다른 서버 인 server2008, server2003 및 windows 7에서 작동하고 있습니다. 문제는 서버 자체가 내가 사용하고있는 인증 코드가 아니라고 생각합니다. – Baxter

+0

@Baxter 예를 들어 [이 질문] (http://stackoverflow.com/q/13406955/628981)과 같이 올바른 플래그를 설정하면 차이가 생길 수 있습니다. –