때때로 우리가 작성하는 asp.net 애플리케이션은 가상 호스트에서 실행됩니다. 일부 가상 호스트는 보안 문제로 인해 asp.net에 대한 권한을 설정했을 수 있으며, 이로 인해 애플리케이션이 제대로 실행되지 않을 수 있습니다.
문제 증상:
어떤 이유로 asp.net이 일부 dll 파일을 로드할 수 없으며 다음과 같은 오류 메시지가 나타납니다. '/' 응용 프로그램에 서버 오류가 있습니다.
--------------------------------
필수 권한을 획득할 수 없습니다. .
설명: 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 오류 및 오류가 발생한 코드에 대한 자세한 내용은 스택 추적을 검토하세요.
예외 세부 정보: System.Security.Policy.PolicyException: 필수 권한을 얻을 수 없습니다.
소스 오류:
현재
웹 요청을 실행하는 동안 처리되지 않은 예외가 생성되었습니다. 예외의 출처와 위치에 관한 정보는 아래 예외 스택 추적을 사용하여 식별할 수 있습니다
.
[정책 예외: 필수 권한을 획득할 수 없습니다.]
System.Security.SecurityManager.ResolvePolicy(증거 증거, PermissionSet reqdPset, PermissionSet optPset, PermissionSet DenyPset, PermissionSet& 거부, 부울 checkExecutionPermission) +2738293
System.Security.SecurityManager.ResolvePolicy(증거 증거, PermissionSet reqdPset, PermissionSet optPset, PermissionSet DenyPset, PermissionSet& 거부, Int32& securitySpecialFlags, Boolean checkExecutionPermission) +57
[FileLoadException: 'Microsoft.Practices.ObjectBuilder, 버전=1.0' 파일 또는 어셈블리를 로드할 수 없습니다. .51205.0, Culture=neutral, PublicKeyToken=null' 또는 해당 종속성 중 하나입니다. 최소 권한 요청을 부여하지 못했습니다(HRESULT 예외: 0x80131417).
System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence AssemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection.Assembly.InternalLoad(AssemblyName 어셈블리Ref, 증거 어셈블리 보안, StackCrawlMark& stackMark, Boolean forIntrospection) +211
System.Reflection.Assembly.InternalLoad(문자열 어셈블리스트링, 증거 어셈블리 보안, StackCrawlMark& stackMark, Boolean forIntrospection) +141
System.Reflection.Assembly.Load(문자열 어셈블리문자열) +25
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(문자열 어셈블리 이름, 부울 starDirective) +32
문제 분석:
제가 관찰한 바에 따르면 asp.net 응용 프로그램에서 직접 생성한 dll은 정상적으로 로드할 수 있고, asp.net에서 직접 호출한 외부 dll도 정상적으로 로드할 수 있지만 외부 dll에서만 참조하는 다른 외부 dll은 로드할 수 없습니다. 짐을 실은. 내 추측은 권한이 불완전하기 때문에 asp.net 응용 프로그램 자체에서 생성된 DLL과 직접 참조하는 DLL은 권한 상속을 통해 권한을 얻을 수 있는 반면, 외부 DLL에서만 참조하는 다른 외부 DLL은 권한 제한으로 인해 권한을 상속할 수 없다는 것입니다. 그래서 권한이 부족하다는 문제가 있습니다.
문제 해결:
내 컴퓨터에서의 실험을 통해 가상 호스트에서 루트 web.config(내 컴퓨터의 위치는 C:WINDOWSMicrosoft.NETFrameworkv2.0.50727CONFIG)의 설정이 수정된 것으로 추측됩니다.
기본 web.config 권한 설정 섹션은 다음과 같습니다.
<위치allowOverride="true">
<시스템.웹>
<보안정책>
<신뢰 수준 이름="전체" 정책 파일="내부" />
<trustLevel name="높음"policyFile="web_hightrust.config" />
<trustLevel name="Medium"policyFile="web_mediumtrust.config" />
<trustLevel name="낮음"policyFile="web_lowtrust.config" />
<trustLevel name="Minimal"policyFile="web_minimaltrust.config" />
</security정책>
<신뢰 수준="전체" OriginUrl="" />
</system.web>
</위치>
아마도 가상 호스트에서 수정된 설정일 것입니다: <locationallowOverride="false">
<시스템.웹>
<보안정책>
<신뢰 수준 이름="전체" 정책 파일="내부" />
<trustLevel name="높음"policyFile="web_hightrust.config" />
<trustLevel name="Medium"policyFile="web_mediumtrust.config" />
<trustLevel name="낮음"policyFile="web_lowtrust.config" />
<trustLevel name="Minimal"policyFile="web_minimaltrust.config" />
</security정책>
<신뢰 수준="높음" OriginUrl="" />
</system.web>
</location> 그는 먼저 AllowOverride를 false로 설정하여 사용자의 web.config에서 권한을 재정의하는 기능을 방지합니다. 그런 다음 신뢰 수준을 기본 전체 대신 높음으로 정의했습니다. 테스트 후 신뢰 수준이 전체가 아닌 한 외부 dll에서만 참조하는 다른 외부 dll을 로드할 수 없습니다. 따라서 기술 지원팀에서는 AllowOverride 섹션을 true로 설정하는 것이 좋습니다. 이렇게 하면 web.config에서 권한을 다시 지정할 수 있습니다.
예: <trust level="Full" OriginUrl="" />
최근 aps.net을 공부한 적이 없어서 그 근본 원인을 주의깊게 살펴보지 않았습니다. 어쩌면 제가 이해한 것이 틀렸을 수도 있습니다. 전문가가 근본적인 이유를 말하거나 실수를 바로잡을 수 있기를 바랍니다.