2013-03-28 3 views
8

IIS7.5에 내 웹 사이트를 배포 한 결과 응용 프로그램 풀 ID가 ApplicationPoolIdentity (기본값 : IIS Application Pool Identities으로 권장) 인 경우 Ninject이 무시되는 것처럼 보입니다. 다음 오류가 발생하는 동안IIS 7 응용 프로그램 풀 ID를 올바르게 설정하는 방법?

System.InvalidOperationException : 맨 처음 컨트롤러를 만드는 유형 의 컨트롤러를 만들 하려고 할 때 오류가 발생했습니다 '..MainController'. 컨트롤러에 매개 변수없는 public 생성자가 있는지 확인하십시오. ---> System.DirectoryServices.DirectoryServicesCOMException : 작업 오류가 발생했습니다.

나는 (모든 하위 폴더 및 파일 포함) 사이트가 포함 된 폴더에 IIS AppPool\<MySiteAppPool>FullAccess을 부여했지만,이 아무것도 변경하지 않았다.

그러나 응용 프로그램 풀 ID를 모든 도메인 계정 (관리 권한이없고 사이트가있는 폴더에 대한 액세스 권한이없는 단순한 계정)으로 설정하면 정상적으로 작동합니다.

Ninject는 NuGet 패키지를 통해 Setting up an MVC3 application 튜토리얼에 따라 설치됩니다.

관련성이있는 경우 사이트가 Windows 인증을 사용하여 도메인 인트라넷에서 작업하기로되어 있습니다.

그래서 유일한 문제는 응용 프로그램 풀 ID와 관련된 것 같습니다. 내가 권장하는 방법을 사용하기를 열망하는 한, 도메인 계정이 아닌 ApplicationPoolIdentity을 갖고 싶습니다.

무엇이 연결할 수 있습니까? 이 모든 것들을 함께 혼합 할 수 있습니까?


여기에 유사한 문제가있는 SO 스레드가 있습니다 : ASP.NET MVC 4 + Ninject MVC 3 = No parameterless constructor defined for this object. 그러나 거기에도 전혀 적합한 대답이 없습니다.


삭제 된 의견이 제안됨에 따라 NetworkSerive을 신원으로 사용하려고 시도했습니다. 그리고 제대로 작동했습니다. 그러나 비 특권 도메인 계정보다 훨씬 좋을 것으로 생각됩니다.


편집은 갑자기 다른 의존성을 발견 : 나는 클라이언트 측 사용자의 자격 증명이 사용될 것으로 예상하지만 응용 프로그램 풀 ID는 SQL 서버의 Windows 인증에 사용됩니다.

의견

을 기반으로 원격 SQL 서버가 가장 통해 인증 자격 증명을 사용하여 액세스 할 수 있음을 동의합니다.


그러나 ApplicationPoolIdentity 및 Ninject의 문제점은 아직 명확하지 않습니다.

이 질문의 맨 위에 나와있는 기사는 가상 계정 에 사용자 프로필이 없음이 있다는 사실 때문에이 문제가 발생할 수 있다고 생각했습니다. 이 측면은 IIS가 LoadUserProfile 특성을 가진 사용자 프로필을로드 할 수 있도록하기 때문에 여전히 불분명합니다. 가상 계정에 대한 프로필이 없으면 IIS를로드 할 수 없습니다.

IIS는 Windows 사용자 프로필을로드하지 않지만, 특정 응용 프로그램 임시 데이터를 저장하는 데 어쨌든 활용할 수 있습니다

거기 말한다. SQL Express 은이를 수행하는 응용 프로그램의 예입니다. 그러나 사용자 프로필은 프로필 디렉터리 또는 레지스트리 하이브에 임시 데이터를 저장하기 위해 만들어야합니다. NETWORKSERVICE 계정의 사용자 프로필은 시스템에서 생성되었으며 항상 입니다. 그러나 고유 한 응용 프로그램 풀 ID로 전환하면 시스템에서 사용자 프로필을 만들지 않습니다. 표준 응용 프로그램 풀 (DefaultAppPool 및 Classic .NET AppPool) 에만 디스크에 사용자 프로필이 있습니다. 관리자가 새 응용 프로그램 풀을 만드는 경우 사용자 프로필이 만들어지지 않습니다.

그러나 원하는 경우 "LoadUserProfile"특성을 "true"로 설정하여 사용자 프로필을로드하도록 IIS 응용 프로그램 풀을 구성 할 수 있습니다. 이

How can I assign active directory permission to the default app pool identity

그것은 또한 응용 프로그램 풀 ID 특히, 네트워크 서비스로 작동 할 수 없음을 명시하고, 쿼리


나는 serverfault.com에서 다음 스레드를 발견 광고.

+0

누구에게 액세스 권한을 부여 했습니까? – V4Vendetta

+0

@ V4Vendetta 사이트를 포함하는 폴더 (모든 하위 디렉터리 및 파일 포함)에'IIS AppPool \ '에'FullAccess '를 부여했습니다. – horgh

+0

그래, 이벤트 로그에 추가로 보여줄 것이 있습니까? – V4Vendetta

답변

2

질문에서 자세한 내용을 보면 COMException이 던져진 사용 권한 문제와 비슷하게 들리므로 Ninject가 MainController을 인스턴스화하지 못하게합니다. 예외는 Active Directory를 쿼리하는 데 사용되는 클래스 인 System.DirectoryServices과 관련이 있습니다.

IIS가 일반 응용 프로그램 풀 계정으로 실행되는 경우 해당 계정에는 Active Directory에 대해 쿼리를 수행 할 수있는 권한이 없으므로 COMException을 throw 할 수 있습니다. 예외의 실제 메시지 (매개 변수없는 생성자를 찾을 수 없음)는 빨간색 청어의 비트이며 Ninject가 일반 생성자가 작동하지 않기 때문에 다른 생성자로 폴백하려는 것으로 생각합니다.

도메인 계정으로 실행되도록 IIS 응용 프로그램 풀을 변경하면 해당 계정에 도메인 쿼리 권한이 있으므로 갑자기 작동합니다.

자신이 System.DirectoryServices을 사용하고 있는지 또는 Ninject/IIS/ASP가 사용 중인지 여부는 질문에서 분명하지 않습니다. 직접 사용하는 경우 AD 클래스의 생성자 중 어떤 것도 예외를 throw (캐치 및 로그 등) 할 수 없으므로 시작시 응용 프로그램이 손상되는 것을 방지 할 수 있습니다. 위의 권한에 대해 아마 알게 될 것입니다.

IIS를 일반 응용 프로그램 풀 계정으로 실행하는 것이 좋지만 도메인 사용자로 AD를 계속 쿼리하려면 자격 증명을 DirectoryEntry으로 지정하고 DirectorySearcher을 사용하여 AD 검색을 수행 할 수 있습니다. .Net 4 이상이면 새로운 System.DirectoryServices.AccountManagement 클래스 (대신 자격 증명을 지정할 수 있음)를 사용하는 것이 좋습니다.

이 방법을 사용하면 AD 쿼리에 가장이 필요 없으며 응용 프로그램 풀이 여전히 일반 응용 프로그램 풀 계정으로 실행될 수 있습니다.

+0

그건 사실이 아니야.네트워크 서비스는 네트워크 리소스에 액세스 할 수있는 권한이 낮은 계정입니다. 그렇게하면 컴퓨터 도메인 계정으로 작동합니다. 그래서 당신이 광고에 접근하고 기계가 domain \ webserver라고 불리우면 credential domain \ webserver $를 사용할 것입니다. 이러한 자격 증명은 필요한 것보다 적은 권한을 가질 수 있습니다. –

+1

@Simon AD 조회에 가장이 필요 없으며 NetworkService 계정에 대한 참조가 제거되었음을 명확히하기 위해 답을 업데이트했습니다. 이는 일반적으로 IIS 앱 풀 계정 (예 : ASP.Net v4.0)과 NetworkService 계정의 차이로 인해 오해의 소지가있었습니다. –

+0

@AdamRodger 실제로 AD에 액세스 할 때 올바른 방향으로 나를 지적했다고 생각합니다. 가상 계정으로 실행하는 것이 실패하는 이유가되어야합니다. 최대한 빨리 확인해 보겠습니다. – horgh

9

iispool \ appPoolName 계정은 Windows 2008에 추가 된 가상 계정 &으로 불립니다. 아이디어는 실제로 진정한 의미에서 계정이 아닙니다. 이들이 허용하는 것은 기본 계정을 사용하는 프로세스간에 향상된 보안입니다.

컴퓨터의 많은 서비스는 네트워크 액세스가 가능한 계정 인 networkService를 사용합니다. 따라서 공격자가 이러한 서비스 중 하나를 악용하는 경우 동일한 계정으로 실행되는 다른 프로세스에 액세스 할 수 있습니다. IIS에서 사용되는 것과 같은 가상 계정은 다른 계정으로 표시되는 것을 방지하지만 여전히 동일한 계정입니다. asp.net 앱은 기술적으로 네트워크 서비스로 실행 중입니다. &이 계정에 shadowl이 여전히 작동하도록 권한을 부여합니다. 이는 네트워크 자원에 액세스해야하는 경우 networkservice가 & 기계 도메인 계정을 사용하므로 iispool 계정이 수행한다는 것을 의미합니다.

원격 SQL 서버에 액세스하는 경우이 계정을 추가해야 웹 서버에서 액세스 할 수 있습니다. SQL 서버에 사용자가 누구인지 정말로 알 필요가없는 한 가장 (impersonation)을 사용하는 것은 권장하지 않습니다. 앱 보안을 끄는 것이 더 간단합니다.

주사가 제대로 작동하지 않는 이유는 종속성에 문제가있는 것일 수 있습니다. 만약 controllerA에 ClassB가 주입되고 ClassC가 ClassC &으로 주입되면 클래스가 ClassD를 주입하지 못하면 전체 체인이 실패합니다. 나는 그 일이 있었는지 & 그것이 내가보고 있었던 것에서 그렇게 제거 된 것이었다는 것을 깨닫는 데 시간이 걸렸다.

관련 문제