2014-11-05 2 views
0

WCF 프로젝트에 대해 사용자 지정 ServiceAuthorizationManager를 "CustomUserNamePasswordValidator"로 만들었습니다. 아래는 내 프로젝트의 스 니펫입니다. WCF API를 실제로 호출하기 전에 wcf가이 authorization 클래스를 호출하기를 원하지만 이것은 일어나지 않습니다. 내 "로그인"WCF API가이 인증 클래스에 대해 호출자를 호출하고 있습니다. 그래서 클라이언트가 Login을 호출 할 때 "CustomUserNamePasswordValidator"와 Login 메소드를 동시에 호출합니다.WCF 용 ServiceAuthorizationManager 사용자 지정

인증 클래스

public class CustomUserNamePasswordValidator : ServiceAuthorizationManager 
{ 
    HttpRequestMessageProperty httpProperties; 
    string operationName; 

    protected override bool CheckAccessCore(OperationContext operationContext) 
    { 
     operationName = GetOperationName(operationContext); 
     httpProperties = (HttpRequestMessageProperty)operationContext.IncomingMessageProperties["httpRequest"]; 
     string authHeader = httpProperties.Headers[HttpRequestHeader.Authorization]; 

     string subno = string.Empty; 
     string password = string.Empty; 
     string version = string.Empty; 
     string credntialType = string.Empty; 

      string[] credentials = authHeader.Split(':'); 
      credntialType = credentials[0]; 

       password = credentials[1]; 

       if (!AuthorizeUser(password)) 
       { 
        throw new ArgumentException("401:Token invalid or expired.(0x000)");       
       } 
      } 
     } 

    private int AuthenticateUser(string subno, string pin, string version) 
     { 
     } 
    } 

WCF 클라이언트 서비스 발췌문

public class ClientService : IClientService 
{ 
    public wsLoginResult LoginUser() 
    { 
      HttpRequestMessageProperty httpReqProps = (HttpRequestMessageProperty)OperationContext.Current.IncomingMessageProperties["httpRequest"]; 
      string res = httpReqProps.Headers[HttpRequestHeader.Authorization]; 

      foreach (var item in res.Split(':'))     
       ActivityLog("Activity", "Login Steps", item, item); 
    } 
} 

의 Web.config 발췌문

<?xml version="1.0"?> 
<configuration> 
<connectionStrings> 
<add name="wmas_subsConnectionString" connectionString="Data Source=WT;Initial Catalog=wmas;User ID=sa;Password=ra3?" providerName="System.Data.SqlClient"/> 
</connectionStrings> 
<system.web> 
    <compilation targetFramework="4.5" debug="true"/> 
    <httpRuntime targetFramework="4.5"/> 
</system.web> 
<system.serviceModel> 
    <client> 
    <endpoint address="http://192.168.1.12:7002/MobileApplicationWS/MobileApplicationApiWSImplService" 
      binding="basicHttpBinding" bindingConfiguration="MobileApplicationApiWSPortBinding" 
      contract="VASService.MobileApplicationApiWS" 
      name="MobileApplicationApiWSPort" /> 

</client> 
<services> 
    <service name="ClientService.ClientService" behaviorConfiguration="ClientService.ServiceBehavior"> 
    <endpoint address="" 
       binding="webHttpBinding" bindingConfiguration="webHttpBindingConfiguration" 
       contract="ClientService.IClientService" behaviorConfiguration="webBehaviour"/> 
    <endpoint address="stream" 
       binding="webHttpBinding" bindingConfiguration="webHttpBindingConfigurationStreamed" 
       contract="ClientService.IClientService" behaviorConfiguration="webBehaviour"/> 
    <endpoint address="mex" 
       binding="mexHttpsBinding" 
       contract="IMetadataExchange" />   
    </service> 
</services> 
<bindings> 
    <basicHttpBinding> 
    <binding name="MobileApplicationApiWSPortBinding" /> 
    </basicHttpBinding> 
    <webHttpBinding> 
    <binding name="webHttpBindingConfiguration" /> 
    <binding name="webHttpBindingConfigurationStreamed" transferMode="StreamedResponse" /> 
    </webHttpBinding> 
    </bindings> 
    <behaviors> 
    <serviceBehaviors> 
    <behavior name="ClientService.ServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     <serviceAuthorization serviceAuthorizationManagerType="ClientService.CustomUserNamePasswordValidator, ClientService" /> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <behavior name="webBehaviour"> 
     <webHttp/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
<protocolMapping> 
    <add binding="basicHttpsBinding" scheme="https"/> 
    </protocolMapping> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 
    </system.serviceModel> 
<system.webServer> 
<modules runAllManagedModulesForAllRequests="true"/> 
<directoryBrowse enabled="true"/> 
</system.webServer> 
    </configuration> 
+0

편안한 서비스 또는 SOAP입니까? web.config에서 더 많이 포함하십시오 –

+0

web.config의 수정 된 게시물을 참조하십시오. –

답변

0

귀하의 솔루션이 작동하지 않는 이유는 CustomUserNamePasswordValidator을 RESTful 서비스에서 사용할 수 없기 때문입니다. 다음을보십시오 : http://msdn.microsoft.com/en-us/library/aa354513(v=vs.110).aspx

이 예제는 SOAP를 사용하고 serviceAuthorization 태그를 활성화하는 엔드 포인트의 동작을 정의합니다. 끝점의 보안을 정의하지 않으면 serviceAuthorization이 작동하지 않습니다. 없음/전송/TransportCredentialOnly : 편안한 서비스

<bindings> 
    <wsHttpBinding> 
    <!-- username binding --> 
    <binding name="Binding"> 
     <security mode="Message"> 
     <message clientCredentialType="UserName" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

은 3있다 어떠한 SecurityMode = Message 없다. 여기에서 읽어보십시오. http://msdn.microsoft.com/en-us/library/bb924478(v=vs.110).aspx

clientCredentialType="UserName"은 메시지에서만 사용할 수 있습니다.

엔드 포인트 보안 모드를 다음으로 정의 할 수 있습니다. 전송 다음으로 자격 증명 유형을 기본/인증서/다이제스트/없음/Ntlm/Windows로 시도 할 수 있지만 솔루션으로 볼 때 이들이 아무리 잘 작동하는지 알 수 없습니다 .

헤더를 추출하고 "승인 된"방법을 사용하지 않으면 인증을 수행하는 더 좋은 방법이 있습니다. 확장 서비스를 사용해보십시오. http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iparameterinspector(v=vs.110).aspx

행운을 비네!

관련 문제