2011-12-20 1 views
4

인트라넷 용으로 구축 한 여러 웹 응용 프로그램이 있습니다. 사용자가 로그인하는 것을 걱정하지 않도록하고 싶었 기 때문에이 앱은 사이트에 접속할 때 현재 로그온 한 사용자를 끌어옵니다. 이 코드를 사용하면 다음과 같은 코드가 사용됩니다.ASP.Net (IIS 7.5) 사용자 자격 증명없이 Active Directory 쿼리

Dim userName As String = User.Identity.Name 
CurrentUser = userName.Substring(userName.IndexOf("\") + 1) 

이것은 매력적으로 작동하며 여기에는 문제가 없습니다. 다음 단계는 로그인 한 사용자에 대해 Active Directory에 쿼리하여 다양한 정보를 가져 오는 것입니다. 어떻게 코딩했는지, devleopment 측면의 매력처럼 작동합니다 (IIS를 실행하지 않기 때문에 일반적 임).

IIS 서버 (IIS 7.5를 실행하는 Windows Server 2008 R2)에 게시 할 때 문제가 발생하면 Active Directory를 쿼리하는 코드의 특정 줄을 가리키는 오류 메시지가 나타납니다. 재미있는 부분은 위의 애플 리케이션이 위대한 지난주 일하고 있었다는 것입니다. 그들은 내 서버 관리자가 Windows Update의 최신 배치를 수행 한 후 깨졌습니다 (.Net Framework 4.0을 사용하여 실행 중입니다).

Windows 인증이 사용되도록 각 응용 프로그램을 설정하기 전에 다른 인증 유형이 비활성화되었습니다. . 공급자의 경우 Negotiate는 # 1, NTLM은 # 2입니다. 고급 설정의 경우 확장 된 보호 = 꺼짐 및 커널 모드 인증 사용이 선택되어 있습니다.

<customErrors mode="Off"/> 
<authentication mode="Windows" /> 
<authorization> 
    <deny users="?"/> 
</authorization> 

이가 내가 가진의 설정을, 그리고 모든 마법처럼 일했다 :

내 Web.config의 다음과 같은 세트가 있습니다. 이제는 다소 효과를 발휘하기 위해 NTLM이 # 1이고 협상이 # 2이므로 제공자를 교환해야합니다. 이 때문에 사용자의 자격 증명이 제대로 전달되지 않고 AD 쿼리가 실패합니다. 이것은 내가 쿼리를 위해 사용하고 코딩입니다 : 앞에 협상에 사이트를로드 할 때 사용자 이름/암호가 설정되어 있지 않기 때문에 업데이트 이후로

Dim adSearchRoot As New DirectoryEntry("LDAP://DC=[DOMAIN],DC=com") 
Dim adSearch As New DirectorySearcher(adSearchRoot) 

adSearch.Filter = "(&(ObjectClass=User)(sAMAccountName=" & CurrentUser & "))" 
Dim searchResult As SearchResult = adSearch.FindOne() 

,, 그 결론에 실패 DirectoryEntry에 대해. 사용자 이름/암호를 설정해도 이전처럼 100 % 작동하지 않습니다.

내 질문에, 사용자가 사이트에 액세스 할 수 있도록하려면 어떻게해야합니까, 그들의 사용자 이름을 알 수 있으며 DirectoryEntry에서 사용자 이름/암호를 사용하지 않아도 활성 디렉토리를 쿼리 할 수 ​​있습니까 ??

IIS의 설정입니까? 코드를 다시 작성해야합니까? web.config 설정? 서버 업데이트를 되돌려 놓아야하며 어느 부분에서 중단이 발생하는지 파악해야합니까?

미리 조언 해 주셔서 감사합니다. 질문에 대한 답변을 드릴 질문이 있으면 알려주십시오.

UPDATE 매트 내 web.config 파일에 다음 클립을 추가하여 제안 내가 노력

:

<security> 
    <authorization> 
    <add accessType="Deny" users="?" /> 
    </authorization> 
</security> 

이 작동하지 않았다. 나는 약간의 독서를했고, 그 다음이 섹션의 추가 변경 :

<location path="Default Web Site/NameOfApp"> 
    <system.webServer> 
    <security> 
     <authentication> 
     <anonymousAuthentication enabled="false"/> 
     <windowsAuthentication enabled="true"> 
      <providers> 
      <add value="Negotiate" /> 
      <add value="NTLM" /> 
      </providers> 
     </windowsAuthentication> 
     </authentication> 
     <authorization> 
     <add accessType="Deny" users="?" /> 
     </authorization> 
    </security> 
    </system.webServer> 
    </location> 

이 일에서 나는 또한 내 Web.config의 섹션에서 최대 높았다 문자열을 제거했습니다.이것도 작동하지 않았다. (fyi, 위대한 참고 번호였다.) http://www.iis.net/ConfigReference/system.webServer/security/authentication

다음은 비슷한 상황 인 것 같았습니다. http://social.technet.microsoft.com/Forums/en/winserverDS/thread/7deba16b-295a-4887-98f9-9f291ed49871. 이 기사는 결국 "이중 홉"을 참조하여이 문제를 조사하고 몇 가지 시도를 한 후에도 내 문제를 해결하지 못했습니다.

나는 문제가 재현 여부 있는지, 다른 서버 2008 R2 시스템에서 새로운 IIS 7.5 구현을 시도하는 것 본질적으로 처음부터 다시 시작하고

다음 단계.

새로운 제안은 큰 도움이 될 것입니다.

+0

오늘 아침에 IIS 6.0을 실행하는 Windows Server 2003 R2 상자에서이 기능을 사용하기로 결정했습니다. 이것을 설정하고 작동해야하는 것처럼 작동하게하는 것은 매우 쉽습니다. 먼저이 웹 인스턴스가 다른 응용 프로그램 풀과 공유하지 않고 자체 인스턴스에 .NET Framework 4를 실행할 수 있도록 응용 프로그램 풀을 만들었습니다. 그렇지 않으면 오류가 발생합니다. 그런 다음 올바른 웹 사이트 아래에 가상 디렉터리를 만들었습니다. 인증은 익명 액세스가없는 Windows 통합 인증으로 설정됩니다. 이러한 설정을 사용하면 매력처럼 작동합니다. 이제 Server 08을 작동시켜야합니다. – JasonH

답변

1

Windows 2008 Server에서 아무런 문제없이 코드를 실행할 수있었습니다. 새로운 .NET 4.0 응용 프로그램 풀을 만들어 웹 응용 프로그램에 할당했습니다. 익명 액세스를 거부하고 Windows 인증을 사용하도록 web.config를 변경했습니다. 코드가 예외없이 실행되었습니다. 당신의 Web.config 클립을 보면

, 궁금 이것은 당신이 무엇을 놓치고 있는지있을 경우 :

<system.webServer> 
    <security> 
     <authorization> 
     <add accessType="Deny" users="?" /> 
     </authorization> 
    </security> 
    </system.webServer> 

그것은 당신이 의 system.webServer 섹션 내에서이 인증 섹션을하는 것이 중요합니다. IIS 7은 system.webServer 섹션을 사용하여 IIS 6의 메타베이스에 포함 된 일부 설정을 저장합니다.

+0

이 코드를 앱의 web.config 파일의 system.webServer 섹션에 추가했습니다. 이것은 아무것도 바뀌지 않았습니다. DirectorySearcher 문자열에 사용자 이름/암호를 추가해도 여전히 작동합니다. 오늘은 더 이상 볼 시간이 없지만 내일은 그걸 가지고 놀 것입니다. 너는 적어도 나에게 놀 새로운 것을 주었다. – JasonH

+0

응용 프로그램 풀이 실행되는 사용자를 변경해 보셨습니까? 이 방법으로 유지하고 싶지는 않지만 도메인 관리자 계정을 제공하면 어떤 일이 일어나는지 알고 자 할 수 있습니다. 권한 문제인지 여부를 알려줍니다. –

+0

아니, 내일 그 사진을 주겠다. – JasonH

0

이 문제가 발생했습니다. 여기 어떻게 해결할 수 있습니다 :

경로뿐만 아니라 사용자 이름과 암호도 허용하는 DirectoryEntry 생성자에 대해 오버로드 4/5를 사용하십시오. 대신 "도메인 \ 사용자 이름"의 지금

DirectoryEntry adSearchRoot = new DirectoryEntry("LDAP://DC=[DOMAIN],DC=com", "DOMAIN\Username", "Password"); 
DirectorySearcher adSearch = new DirectorySearcher(entry); 

을 서비스 계정을 사용하고 암호를 분명히 서비스 계정에 대한 암호를 사용 : 그래서, 당신의 AD 연결은 다음과 같이한다.

서비스 계정이 "Domain Users"그룹의 구성원이라면 아무 문제없이 AD를 쿼리 할 수 ​​있어야한다고 생각합니다.

+0

이 문제는 사용자 이름/비밀번호를 입력하지 않아도된다는 점입니다.내가 말했듯이, 나는 username/password없이 작업을하고 있었고 아무런 통보없이 작동을 멈췄다. 특히 IIS 6에서 문제없이 작동시킬 수 있습니다. 노력을 감사하십시오 :) – JasonH

+0

음, 내가 가져간 접근법 (내가 게시 한 방식)은 사용자의 사용자 이름과 암호를 요구하지 않습니다. 이 활성 디렉터리 쿼리 목적으로 특별히 만들어진 하드 코드 된 서비스 계정을 사용합니다. 나는 이것이 최선의 접근법이 아니라는 것을 알고 있습니다. 그러나 이것이 IIS 7.5를 사용하여 해결할 수있는 유일한 해결책이었습니다. 예 ... IIS 6은 훨씬 관대합니다. – jaressloo