도메인 컨트롤러에 대해 자격 증명 집합을 확인하고 싶습니다. 예 :
Username: STACKOVERFLOW\joel
Password: splotchy
방법 1. 가장을 사용하여 Active Directory 쿼리
많은 사람들이 Active Directory에 무언가를 쿼리 할 것을 제안합니다. 예외가 발생하면 이 stackoverflow 질문 에서 제안 된대로 자격 증명이 유효하지 않다는 것을 알 수 있습니다 .
그러나이 접근 방식 에는 몇 가지 심각한 단점이 있습니다 .
도메인 계정을 인증 할뿐만 아니라 암시 적 권한 검사도 수행하고 있습니다. 즉, 가장 토큰을 사용하여 AD에서 속성을 읽습니다. 다른 유효한 계정에 AD에서 읽을 권한이 없으면 어떻게됩니까? 기본적으로 모든 사용자는 읽기 액세스 권한이 있지만 제한된 계정 (및 / 또는 그룹)에 대한 액세스 권한을 비활성화하도록 도메인 정책을 설정할 수 있습니다.
AD에 대한 바인딩에는 심각한 오버 헤드가 있으며 AD 스키마 캐시는 클라이언트에서로드되어야합니다 (DirectoryServices에서 사용하는 ADSI 공급자의 ADSI 캐시). 이것은 네트워크와 AD 서버 모두 리소스를 소비하며 사용자 계정 인증과 같은 간단한 작업에는 너무 비쌉니다.
예외가 아닌 경우 예외 실패에 의존하고 있으며 이것이 잘못된 사용자 이름과 암호를 의미한다고 가정합니다. 다른 문제 (예 : 네트워크 실패, AD 연결 실패, 메모리 할당 오류 등)는 인증 실패로 잘못 해석됩니다.
방법 2. LogonUser Win32 API
다른 사람들 은 LogonUser()
API 기능 사용을 제안했습니다 . 이것은 좋게 들리지만, 안타깝게도 호출하는 사용자는 일반적으로 운영 체제 자체에만 부여 된 권한을 필요로합니다.
LogonUser를 호출하는 프로세스에는 SE_TCB_NAME 권한이 필요합니다. 호출 프로세스에이 권한이 없으면 LogonUser가 실패하고 GetLastError는 ERROR_PRIVILEGE_NOT_HELD를 반환합니다.
어떤 경우에는 LogonUser를 호출하는 프로세스에도 SE_CHANGE_NOTIFY_NAME 권한이 활성화되어 있어야합니다. 그렇지 않으면 LogonUser가 실패하고 GetLastError는 ERROR_ACCESS_DENIED를 반환합니다. 이 권한은 관리자 그룹의 구성원 인 로컬 시스템 계정에는 필요하지 않습니다. 기본적으로 SE_CHANGE_NOTIFY_NAME은 모든 사용자에 대해 활성화되지만 일부 관리자는 모든 사용자에 대해 비활성화 할 수 있습니다.
" 운영 체제의 일부로 작동 "권한을 부여하는 것은 Microsoft가 기술 자료 문서 에서 지적한 것처럼 엉뚱한 일이 아닙니다 .
... LogonUser를 호출하는 프로세스에는 SE_TCB_NAME 권한이 있어야합니다 (사용자 관리자에서 " 운영 체제의 일부로 작동 "권한). SE_TCB_NAME 권한은 매우 강력하며 자격 증명의 유효성을 검사해야하는 응용 프로그램 을 실행할 수 있도록 임의의 사용자에게 부여해서는 안됩니다 .
또한 LogonUser()
빈 암호를 지정하면에 대한 호출 이 실패합니다.
도메인 자격 증명 집합을 인증하는 올바른 방법은 무엇입니까?
나는 어떻게 관리 코드에서 호출 할 수 있지만,이 aa는 일반적인 윈도우 문제이다. 고객이 .NET Framework 2.0을 설치했다고 가정 할 수 있습니다.