2011-03-23 8 views
0

HTML 페이지 (IE7)에 포함 된 .Net 2.0 액티브 X 컨트롤이 있습니다. javascript를 사용하여 속성을 수정하고 메서드를 호출합니다. 이 모든 것은 Activator.CreateInstance (type)를 사용하여 클래스를 인스턴스화하는 메소드를 호출하기 전까지는 괜찮습니다. 다음 메시지가 나타납니다.인트라넷 영역에서 클래스를 인스턴스화 할 때 보안 문제가 발생합니다.

System.Reflection.TargetInvocationException : 예외가 호출 대상에 의해 처리되었습니다. ---> System.Security.SecurityException : 요청이 실패했습니다.
..
..
이었다 실패 동작은 :
실패한 첫 번째 권한 유형 InheritanceDemand이었다 System.Security.PermissionSet
실패 어셈블리의 영역이었다 : 인트라넷

인스턴스화하려고하는 클래스는 parm-less public 생성자이며, 내가 읽은 것으로부터 어쨌든 공용 유형의 리플렉션을 사용하면 문제가 없어야합니다.

Microsoft .NET Framework 구성 유틸리티를 사용하여 인트라넷 트러스트를 전체로 수정하여 임시 수정을 수행했습니다. here을 참조하십시오.

프레임 워크를 구성하지 않아도되도록 메소드, 클래스 또는 어셈블리를 어떻게 수정할 수 있습니까?

몇 가지 추가 포인트 : ActiveX 컨트롤 닷넷 2

  • 에 대해 그것의 어셈블리를 를 컴파일

    • 내가 반사 권한을 부여에 대한 방해 아니에요
    • 이름이 강하지 않다.

    감사

    업데이트

    그것은이 문제를 일으키는 반사하지 않았다 밝혀, 그것은 FileIOPermission에 보안 예외를 던졌다 TypeDescriptor.GetAttributes를 호출했다. 나는 다음과 같은 코드를 사용하여이 문제를 해결했습니다 : 내 어셈블리의 강력한 이름에 할당 된 코드 그룹을 설정하고 완전 신뢰로 설정 권한을 설정하면 이제

    Dim temp As New Security.Permissions.FileIOPermission(Security.Permissions.PermissionState.Unrestricted) 
    temp.Assert() 
    // Get attributes 
    System.Security.CodeAccessPermission.RevertAssert() 
    

    는 모든 것이 괜찮습니다.
    그러나 미세 조정할 수 없습니다. FullTrust이거나 예외가 발생했습니다 (아래 참조). 심지어는 권한 집합이 작동하지 않습니다.

    예외 :

    System.Security.SecurityException: Request failed. 
    at System.Reflection.CustomAttribute._CreateCaObject(Void* pModule, Void* pCtor, Byte** ppBlob, Byte* pEndBlob, Int32* pcNamedArgs) 
    at System.Reflection.CustomAttribute.CreateCaObject(Module module, RuntimeMethodHandle ctor, IntPtr& blob, IntPtr blobEnd, Int32& namedArgs) 
    at System.Reflection.CustomAttribute.GetCustomAttributes(Module decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, Boolean mustBeInheritable, IList derivedAttributes) 
    at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeType type, RuntimeType caType, Boolean inherit) 
    at System.RuntimeType.GetCustomAttributes(Type attributeType, Boolean inherit) 
    at System.ComponentModel.ReflectTypeDescriptionProvider.ReflectGetAttributes(Type type) 
    at System.ComponentModel.ReflectTypeDescriptionProvider.ReflectedTypeData.GetAttributes() 
    at System.ComponentModel.TypeDescriptor.TypeDescriptionNode.DefaultTypeDescriptor.System.ComponentModel.ICustomTypeDescriptor.GetAttributes() 
    at System.ComponentModel.TypeDescriptor.GetAttributes(Object component, Boolean noCustomTypeDesc) 
    at System.ComponentModel.TypeDescriptor.GetAttributes(Object component) 
    ... GetAttributes 
    ... 
    The action that failed was: InheritanceDemand 
    The type of the first permission that failed was: System.Security.PermissionSet 
    The Zone of the assembly that failed was: Intranet 
    
  • 답변

    1

    내가 를 인스턴스화하기 위해 노력하고있어 클래스는 PARM없는 public 생성자, 을 가지고 있으며, 내가 읽은 바로는, 어쨌든 공개되어 유형에 반사를 사용하여 아무 문제가 없을 것?

    클래스와 생성자가 모두 공개 인 경우 리플렉션을 통해 생성자를 호출하는 데 문제가 없어야합니다. 그러나 public이 아닌 클래스의 public 생성자는 여전히 문제를 일으킬 수 있습니다.

    즉, 상속 요청이 실패한 경우 실제 문제가 다른 곳에있는 것처럼 들립니다. 리플렉션을 사용하지 않고 컨트롤 코드에서 클래스의 새 인스턴스를 만들려고하면 어떻게됩니까?

    +0

    흥미 롭습니다. 의심이 옳았고 정상적인 인스턴스 생성도 실패했습니다. 그것은 FileIOPermission 보안 예외를 던지는 TypeDescriptor.GetAttributes에 대한 호출과 관련이 있습니다. 더 자세히 조사해 보겠습니다 ... – Jules

    +0

    지금까지의 위치를 ​​보여주기 위해 내 게시물에 대한 업데이트를 추가했습니다. – Jules

    +1

    http://weblogs.asp.net/whaggard/archive/2008/01/14/issues-with-the-xmlserializer-in-medium-trust-에서 설명한 것과 비슷한 문제가있는 것 같습니다. environments.aspx. 어떤 속성으로 인해 문제가 발생하는지 잘 모르겠 으면 Reflector (http://www.reflector.net/)의 유형 정의를 살펴 보시기 바랍니다. –

    2

    나는 RequireMinimum SecurityAction과 함께, 다른 클래스에 반영하기 위해 시도하는 어셈블리에 대한 귀하의 AssemblyInfo.cs 파일에 ReflectionPermission 속성을 추가합니다.

    그러나이 작업은 인트라넷 영역에서 실행되는 응용 프로그램이 잠시 실행되는 대신 응용 프로그램이 실행되는 것을 막을 수 있다는 것을 알고 있어야합니다. 권한을 주장한다고해서 그들이 부여된다는 의미는 아니며 단지 프로그램이 "실패"할 수있게합니다. 원하는 권한을 모두 요구할 수 있습니다. CAS의 전체적인 기반은 그것이 당신에게 부여 될 필요가 없다는 것입니다.

    앱이나 어셈블리에서 리플렉션을 사용하려면 제한이 적은 영역에서 어셈블리를 실행하거나 (예 : 강력한 서명으로) 어셈블리를 실행하거나 프레임 워크에 ReflectionPermission을 포함하도록 프레임 워크를 구성해야합니다. 인트라넷 권한 집합.

    마지막으로 .NET Framework 4.0에서는 선언적 CAS 보안 모델이 거의 사용되지 않습니다. 나중에이 코드를 .NET 4.0으로 마이그레이션하려고하면 사용 권한을 어설 션하는 방식을 변경해야합니다.

    +0

    답장을 보내 주셔서 감사합니다. 어셈블리에 강력하게 서명하면, 그 어셈블리가 더 이상 변경 될 필요가 있습니까? 예를 들어, 서명 된 어셈블리를 완전히 신뢰하도록 프레임 워크를 구성해야합니까? 이것은 나에게 모두 새로운 btw입니다. – Jules

    +1

    Microsoft의 강력한 이름이나 ECMA의 강력한 이름 이외의 다른 이름으로 강력하게 서명하면 기본적으로 인트라넷 영역에있게됩니다. 어셈블리를 로컬 컴퓨터에 저장하고 거기에서 실행 (내 컴퓨터 영역에서 온 것으로 완전 신뢰 함)하거나 모든 컴퓨터에 대한 사용자 지정 사용 권한 집합을 정의하고 해당 코드가 서명되어 있음을 나타내는 조건으로 정의해야합니다 회사의 강력한 이름이 해당 영역에 해당 권한 집합을 가져옵니다. – KeithS

    관련 문제