2011-07-06 3 views
0

사용자 지정 보안 특성을 구현하려고합니다. 내가사용자 지정 보안 특성에서 mscorlib 예외가 유효하지 않습니다. c'tor

System.IO.FileLoadException occurred 
    Message=The given assembly name or codebase, 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll', was invalid. 
    Source=WcfRoleProviderTestService 
    StackTrace: 
     at SecLib.SecPermissionAttribute..ctor(SecurityAction action) 
     at WcfRoleProviderTestService.Service1.GetData(Int32 value) in D:\TestProjects\WcfRoleProviderTestService\WcfRoleProviderTestService\Service1.svc.cs:line 19 
    InnerException: 

DLL이 서명 c'tor 속성에서 예외를 가지고 몇 가지 이유를 들어 지금

[Serializable] 
    [ComVisible(true)] 
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)] 
    public class SecPermissionAttribute : CodeAccessSecurityAttribute 
    { 
     public SecPermissionAttribute(SecurityAction action) : base(action) { } 

     public override System.Security.IPermission CreatePermission() 
     { 
      IPermission perm = new PrincipalPermission(PermissionState.Unrestricted); 
      return perm; 
     } 
    } 

매우 간단합니다. 나에게 보안 문제가있는 것 같지만 확실하지 않습니다. 그건 그렇고 PrincipalPermissionAttribute를 사용하려고했는데 제대로 작동합니다. VS 2010, FW 4.0을 사용하고 있습니다. WCF 서비스에서 속성이 concumed입니다. 도움을 얻게되어 매우 기쁩니다.

내 서비스 구성은, 내가 Windows XP에서 오류를 모두 가지고 다음

<system.web> 
    <compilation debug="true" defaultLanguage="c#" targetFramework="4.0" /> 

    <roleManager enabled="true" cacheRolesInCookie="true" cookieName=".ASPROLES" 
     defaultProvider="MyRoleProvider"> 
     <providers> 
     <clear /> 
     <add connectionStringName="Service1" applicationName="InfraTest" 
      writeExceptionsToEventLog="false" name="MyRoleProvider" type="SecLib.MyRoleProvider, SecLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=798c04e15cff851a" /> 
     </providers> 
    </roleManager> 

    </system.web> 

<system.serviceModel> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBindingConfiguration" closeTimeout="00:01:00" 
      sendTimeout="00:10:00" maxBufferSize="524288" maxReceivedMessageSize="524288"> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Windows" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <services> 
     <service name="WcfRoleProviderTestService.Service1" 
       behaviorConfiguration="BasicHttpServiceBehavior" > 
     <endpoint name="BasicHttpEndpoint" 
        contract="WcfRoleProviderTestService.IService1" 
        address="WcfAuthenticationTest" 
        binding="basicHttpBinding" 
        bindingConfiguration="BasicHttpBindingConfiguration" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost/WcfRoleProviderTestService/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="BasicHttpServiceBehavior"> 
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" 
      roleProviderName="MyRoleProvider" impersonateCallerForAllOperations="true" /> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

인 5.1을 IIS 및 Windows Server WCF 서비스를 사용하도록 구성되어있는 경우에만 2008 R2 IISV7.5에 Windows 인증 (위의 구성 참조). 더 흥미로운 사실은 속성이 System.Security.Permissions.SecurityAction.Demand 보안 조치와 함께 사용되는 경우에만 오류가 발생한다는 것입니다.

[OperationBehavior(Impersonation = ImpersonationOption.Allowed)] 
[SecPermission(System.Security.Permissions.SecurityAction.Demand)] 
public string GetData(int value) 
{ 
     string userName = ServiceSecurityContext.Current.WindowsIdentity.Name; 
     return string.Format("You entered: {0}, User {1}", value, userName); 
} 

기타 옵션이 정상적으로 작동합니다. 감사합니다. .

+0

불행히도 문제를 재현 할 수는 없습니다. 특성이 서비스 프로젝트 또는 별도의 DLL에 선언되어 있습니까? DLL이 서명되었다고 말하면 어떤 DLL이 서명되고 어떤 종류의 서명 (강력한 이름 또는 인증 코드)이 사용되는 것입니까? 또한, 코드의 어떤 부분에 속성을 적용 했습니까? –

+0

안녕하세요 @ 니콜, 나는 둘 다, 별도의 DLL과 서비스 DLL을 시도, 결과는 동일합니다. 지금은 간단하게하기 위해 속성은 서비스와 동일한 dll에 정의되어 있고 dll은 문자열 이름 (* .snk 파일)으로 서명되어 있습니다. 이 속성은 Service 메소드 (구현이 아닌 계약)에 적용됩니다. –

+0

그래도 문제를 재현 할 수는 없습니다. 어떻게 당신은 서비스를 호스팅하고 있습니까? 또한 기본 동작, 활성화 등을 변경 했습니까? –

답변

0

동료 중 한 사람의 도움을 받아 문제가 해결되었습니다. 예외의 정확한 이유는 무엇인지 모르겠지만 컴파일 문제 인 것 같습니다. 프로젝트 유형을 웹 애플리케이션에서 웹 사이트로 변경했을 때 풀 정의 (64 또는 32 비트)에 따라 런타임에 컴파일됩니다. 제대로 작동하기 시작했습니다.

관련 문제