2013-02-14 1 views
1

.NET Framework 4에서 Windows 인증을 사용하는 인트라넷 ASP.NET MVC3 웹 응용 프로그램이 있습니다. 모든 코드가 사용자를 인증합니다. 기본 인증을 위해 Windows 인증을 사용하고 Active Directory 사용자를 SQL Server 2008의 테이블에있는 사용자에게 연결하여 내 응용 프로그램과 관련된 추가 사용자 속성을 연결합니다. 이 모든 것이 잘 작동합니다.ASP.NET MVC IIS 7에 배포 할 때 모든 사용자를 검색하는 Active Directory 코드가 작동하지 않습니다.

admins가 Active Directory 사용자를 선택하여 SQL 사용자 테이블에 추가하고 (위 참조) 특정 사이트 속성 (IsAdmin, ShoeSize 등)을 입력 할 수있는 섹션이 있습니다. 이 화면에는 사용자 이름과 Active Directory 사용자의 전체 이름 속성을 보유한 사용자 지정 개체에서 모든 Active Directory를 검색하기 위해 채울 드롭 다운 목록이 있습니다. 웹 응용 프로그램이 IIS 7에 배포 할 때 몇 가지 이유를 들어

  public IQueryable<ActiveDirectoryUser> ActiveDirectoryUsers 
      { 
       get 
       { 
        // get list of users in the Active Directory 
        DirectoryEntry dirEntry = new DirectoryEntry("WinNT://" + Environment.UserDomainName); 
        List<DirectoryEntry> activeDirectoryUsers = dirEntry.Children.Cast<DirectoryEntry>() 
         .Where(c => c.SchemaClassName == "User").ToList(); 

        // populate a custom class I have to hold the active directory user's username and full name property values 
        return activeDirectoryUsers 
         .Where(u => !string.IsNullOrEmpty(u.Properties["FullName"].Value.ToString())) 
         .Select(u => new ActiveDirectoryUser() 
         { 
          NetworkId = String.Format(@"{0}\{1}", Environment.UserDomainName, u.Properties["Name"].Value), 
          FullName = u.Properties["FullName"].Value.ToString() 
         }).AsQueryable(); 
       } 
      } 

Visual Studio에서 IIS 익스프레스에서 사이트를 실행하는 경우 그러나, 이것은 완벽하게 작동이 코드는 어떤 결과를 반환하지 : 여기에이 코드입니다. 왜 이런 일이 일어날 지 아이디어가 있습니까? 나는 IIS 설정을 범인으로 찾고 있었지만 도움이되는 것을 찾지 못했습니다. Active Directory 사용자를 검색하는 방식을 변경해야합니까? 고맙습니다!

답변

2

이 문제는 Eric J. 대답과 Active Directory 항목을 가져 오는 코드 변경으로 이어졌습니다. 나는하여 DirectoryEntry 방법은 무엇에 IIS가 실행중인 계정 예를 들어, 당신이 의존 할 필요가 없습니다 (권한에 사용할 사용자 이름과 암호를 취할 오버로드 할 수 있다는 것을 발견 여기에 코드입니다.

   List<SearchResult> searchResults; 

       // use login account to access active directory (otherwise it will use the IIS user account, which does not have permissions) 
       using (DirectoryEntry root = new DirectoryEntry("LDAP://CN=Users,DC=test,DC=example,DC=com", "usernameCredential", "passwordCredential")) 
       using (DirectorySearcher searcher = new DirectorySearcher(root, "(&amp;(objectCategory=person)(objectClass=user))")) 
       using (SearchResultCollection results = searcher.FindAll()) 
       { 
        searchResults = results.Cast<SearchResult>().ToList(); 
       } 

       // get the active directory users name and username 
       return searchResults 
        .Select(u => new ActiveDirectoryUser() 
        { 
         NetworkId = String.Format(@"{0}\{1}", this._domainName, u.Properties["sAMAccountName"][0]), 
         FullName = (string) u.Properties["cn"][0] 
        }).AsQueryable(); 

이 내가 Active Directory 항목을 가져올 수는 있지만 그 항목은 사용자 및 개인 개체입니다. 그런 다음 LINQ를 사용하여 내 사용자 지정 모델에 매핑했습니다.

1

비주얼 스튜디오에서 IIS Express에서 실행하는 경우는 IIS의 기본 보안 컨텍스트에서 실행하는 것보다 훨씬 더 높은 권한 집합이 7

사용 권한이있는 Active Directory를 쿼리 할 필요를 정확하게 파악해야합니다 그리고 IIS 7에서 실행되는 응용 프로그램 풀이 올바른지 확인하십시오. 에만이 작업에 필요한 사용 권한 인을 부여하고 계속 진행하기 전에 이러한 권한을 부여한 경우의 의미를주의 깊게 검토하십시오.

+0

감사합니다. DirectoryEntry 개체 생성자에서 사용자 이름과 암호를 지정하는 방법을 찾았습니다. , 그래서 나는 IIS가 실행되고있는 사용자 계정에 대해 걱정할 필요가 없다.이 대답은 나를 해결책으로 생각 나게했다. 고마워! –

관련 문제