2

WCF 자체 호스팅 데이터 서비스 (OData, 그런데)를 만들고 기본 인증을 사용하여 사용자를 인증하고 있습니다. 그다지 어렵지 않았고 몇 가지 구성 단계가 필요했고 UserNamePasswordValidator와 IAuthorizationPolicy를 작성했습니다.CORS 및 기본 인증 지원을 사용하는 WCF 자체 호스팅 데이터 서비스

이제 CORS (Cross-Origin Resource Sharing)를 지원해야합니다. 나는 많은 구현을 시도했다. 어떤 것은 문서화되었고 (예를 들어, this), 다른 것들은 나 자신이 만들었다.

CORS 프리 플라이트 요청 (OPTIONS)에 '인증'헤더가없고 요청을 조작 할 수 없기 때문에 기본 인증을 사용하도록 설정하면 문제가입니다. 브라우저가 그 목적을 달성하지 못할 경우) 서버에서 요청을 가로 채거나 응답 할 수 없습니다. 나는 그것이 얼마나 멀리 가는지도 확인할 수 없다! 많은 Behaviors, Bindings, Managers 등을 구현하려고 시도했지만 "DataService <.OnStartProcessingRequest()"에 대한 요청조차받지 못했습니다. 내가 서버 측에서 기본 인증을 사용하지 않도록 설정하면

, 나는 CORS 프리 플라이트 요청을 잡아 결국 (A IDispatchMessageInspector과 BehaviorExtensionElement를 사용하여) 여기에 응답 할 수하지만,이 방법은 내가에 기본 인증을 구현해야 내 ... 젠장.

도와주세요. 둘 모두 구현하려면 어떻게해야합니까? 기본 인증이 단순히 401 Unauthorized에 응답하기 전에 CORS 프리 플라이트 요청을 가로 챌 수 있습니까?

미리 감사드립니다.

+0

안녕 당신이 해결 했니? 이 주제에도 문제가 있습니다. – acostela

답변

0

처음으로을 입력하면 모든 "OPTIONS"요청을 모두 처리 할 수 ​​있습니다. 내 서비스의
인터페이스 : 나는 다음과 같은 트릭을 사용

/// <summary>Handles ALL the http options requests.</summary> 
[WebInvoke(Method = "OPTIONS", UriTemplate = "*")] 
bool HandleHttpOptionsRequest(); 

구현 :

/// <summary>Handles ALL the http options requests.</summary> 
public bool HandleHttpOptionsRequest() 
{ 
if (WebOperationContext.Current != null && WebOperationContext.Current.IncomingRequest.Method == "OPTIONS") 
    { 
     return true; 
    } 
    return false; 
} 

둘째, 당신은에을 액세스 제어 - 허용 - 자격 증명을 추가해야합니다 "CORS 인 에이 블러"enable-cors

public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) 
{ 
    var requiredHeaders = new Dictionary<string, string> 
     { 
      { "Access-Control-Allow-Credentials", "true" }, 
      { "Access-Control-Allow-Origin", "*" }, 
      { "Access-Control-Request-Method", "POST,GET,PUT,DELETE,OPTIONS" }, 
      { "Access-Control-Allow-Headers", "X-Requested-With,Content-Type,Safe-Repository-Path,Safe-Repository-Token" } 
     }; 

    endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new CustomHeaderMessageInspector(requiredHeaders)); 
}