2013-03-27 137 views
0

我有WCF webservice使用Windows身份驗證和自定義ServiceAuthorizationManager。一切工作正常,但如果重寫CheckAccessCore返回false,我得到錯誤500,而不是我所期望的401。服務不執行任何服務級別的錯誤處理。我怎樣才能發送401而不是500頭?WCF網絡服務定製授權

服務配置:

<!-- App configuration--> 
    <system.web> 
     <compilation debug="true" targetFramework="4.0" /> 
     <customErrors mode="Off" /> 
    </system.web> 

    <appSettings> 
     <!-- Allowed users divided by comma --> 
     <add key="allowedUsers" value="DOMAIN\User1, DOMAIN\User2" /> 
    </appSettings> 

    <!--Webservice--> 
    <system.serviceModel> 
     <services> 
      <service name="WebService.ApiService"> 
       <endpoint binding="basicHttpBinding" bindingConfiguration="AuthenticatedBinding" bindingNamespace="http://namespace.com/customapi" contract="WebService.IApiService" /> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior> 
        <serviceMetadata httpGetEnabled="true"/> 
        <serviceDebug includeExceptionDetailInFaults="true"/> 
        <serviceAuthorization serviceAuthorizationManagerType="WebService.Model.Services.AuthorizationService, WebService" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="AuthenticatedBinding"> 
        <security mode="TransportCredentialOnly"> 
         <transport clientCredentialType="Windows" /> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 

</configuration> 

自定義授權經理:

class AuthorizationService : ServiceAuthorizationManager 
{ 
    private List<string> allowedUsers = new List<string>(); 

    public AuthorizationService() : base() 
    { 
     Configure(); 
    } 

    protected override bool CheckAccessCore(OperationContext operationContext) 
    { 
     base.CheckAccessCore(operationContext); 

     return allowedUsers.Contains(operationContext.ServiceSecurityContext.WindowsIdentity.Name); 
    } 

    private void Configure() 
    { 
     var configRow = ConfigurationManager.AppSettings["allowedUsers"]; 
     var parts = configRow.Split(','); 

     if (parts.Length > 0) 
     { 
      foreach (var part in parts) 
       allowedUsers.Add(part.Trim()); 
     } 
    } 
} 

結果圖像: Result screenshot

回答