2016-09-30 12 views
0

기본 인증과 함께 WCF basicHttpBinding을 사용할 때 IIS 재설정 후 첫 번째 요청은 사용자 권한없이 전송됩니다 (권한 부여없이 : 기본 ...). 데이터)basicHttpBinding with basic authentication 기본 사용자 인증없이 첫 번째 요청 보내기/데이터 전달

코드 :

client.ClientCredentials.UserName.UserName = "myUserName"; 
client.ClientCredentials.UserName.Password = "myPassword"; 
string anything = client.getValue(@"anyParam.."); 

구성 :

<basicHttpBinding> 
    <binding name="ServiceNameHereServiceBinding" > 
     <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Basic" proxyCredentialType="None" 
        realm=""> 
      </transport> 
     </security> 
    </binding> 
</basicHttpBinding> 

는 피들러에 의해 모니터 후, 나는 첫 번째 요청은 항상 (이동 401을 반환, 발견 인증 헤더가없는 경우), 다른 요청이 나오고 505 오류를 반환합니다. 그 이후의 서비스는 이후의 모든 요청에 ​​잘 작동합니다.

답변

0

해결책을 찾았는데 공유 할 수 있다고 생각합니다. 도움이 될 수 있습니다.

이 솔루션은 여기 http://plainoldstan.blogspot.ca/2008/07/avoid-http-401-roundtrip-with-adding.html Stanislav Dvoychenko

입니다 그것은 단순히 그렇게하는 클라이언트에 의존하는 대신, 기본 인증 헤더를 직접 작성하여입니다. 상자 클라이언트가 엔드 포인트를 이미 사전 인증 된 것으로 간주하기 때문입니다.

// Assign client.ClientCredentials.UserName.UserName and client.ClientCredentials.UserName.Password 
SetupClientAuthentication(); 

HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty(); 

httpRequestProperty.Headers[HttpRequestHeader.Authorization] = "Basic " + 
    Convert.ToBase64String(Encoding.ASCII.GetBytes(client.ClientCredentials.UserName.UserName + ":" + 
    client.ClientCredentials.UserName.Password)); 

using (OperationContextScope scope = new OperationContextScope(client.InnerChannel)) 
{ 
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = 
     httpRequestProperty; 

    // Invoke client 
}