2009-09-17 12 views
13

Moje pytanie dotyczy usługi WCF REST dla usług IIS, która odpowiada za pomocą JSONP. Wziąłem klasy w tym rozwiązaniu: http://msdn.microsoft.com/en-us/library/cc716898.aspx i dodałem je do mojego. Wszystko działało dobrze na mojej stacji roboczej programistów, podszywając się pod httpTransport, ale kiedy próbowałem przenieść się na serwer programistyczny, natknąłem się na pewne problemy z bezpieczeństwem. Problemy te zostały rozwiązane za pomocą poniższej konfiguracji i użytkownika tożsamości puli aplikacji. Również konfiguruję plik metabazy IIS dla uwierzytelniania tylko NTLM (używamy IIS 6, ale wkrótce będzie IIS 7, musi działać na obu), ponieważ nie mam dostępu do tworzenia nazwy SPN. Wierzę, że obecna konfiguracja rozwiązała moje problemy z zabezpieczeniami , ale w procesie moja odpowiedź JSONP została obniżona do regualar JSON, to jest problem. Oto właściwa konfiguracja:WCF Niestandardowe powiązanie JSONP i https Transport

<services> 
     <service name="IS.Core.Infrastructure.RESTRouter.Transactions" behaviorConfiguration=""> 
      <endpoint address="" behaviorConfiguration="webHttp" binding="customBinding" 
       bindingConfiguration="jsonpBinding" contract="IS.Core.Infrastructure.RESTRouter.ITransactions"> 
      </endpoint> 
     </service> 

     <service name="IS.Core.Infrastructure.RESTRouter.Queue" behaviorConfiguration=""> 
      <endpoint address="" behaviorConfiguration="webHttp" binding="customBinding" 
       bindingConfiguration="jsonpBinding" contract="IS.Core.Infrastructure.RESTRouter.IQueue" /> 
     </service> 
    </services> 

    <behaviors> 
     <endpointBehaviors> 
      <behavior name="webHttp"> 
       <webHttp /> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 

    <bindings> 
     <customBinding> 
      <binding name="jsonpBinding"> 
       <jsonpMessageEncoding /> 
       <httpsTransport 
         manualAddressing="true" 
         authenticationScheme="Ntlm" /> 
      </binding> 
     </customBinding> 
    </bindings> 

    <extensions> 
     <bindingElementExtensions> 
      <add name="jsonpMessageEncoding" 
       type="IS.Core.Infrastructure.RESTRouter.JsonpBindingExtension, RESTRouter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bindingElementExtensions> 
    </extensions> 

Oto jedna z definicji metody interfejsu:

[OperationContract] 
    [WebGet(UriTemplate = "{ModelPath}/{ObjectTypeName}?callback={callback}", ResponseFormat = WebMessageFormat.Json)] 
    [JSONPBehavior(callback = "callback")] 
    JSONPXml NewObject(string ModelPath, string ObjectTypeName, string callback); 

tutaj jest jego realizacja:

[OperationBehavior(Impersonation = ImpersonationOption.Allowed)] 
    public JSONPXml NewObject(string ModelPath, string ObjectTypeName, string callback) { 

     int val = getEmployeeIdByNTUsername(OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name); 

     JSONPXml jsp = null; 
     EntityPluginReflectorClient client = null; 
     try { 
      client = new EntityPluginReflectorClient(); 
      string output = client.NewObject(ModelPath, ObjectTypeName); 
      jsp = new JSONPXml() { xml = output }; 
     } catch (Exception e) { 
      InfrastructureLog.WriteException(this, "NewObject", e); 
      jsp = getExceptionResponse(e); 
     } 
     finally { 
      client.Close(); 
     } 
     return (jsp); 
    } 

i tutaj jest umowa dane:

[DataContract()] 
public class JSONPXml { 
    public JSONPXml() { } 
    [DataMember] 
    public string xml; 
} 

Proszę dać mi znać, jeśli potrzebne są dodatkowe informacje i dzięki za rozpatrzenie tego.

Odpowiedz

0

Może to wydawać się oczywiste, ale czy sprawdziłeś, że nadal przekazujesz zapytanie o "wywołanie zwrotne" w twoim serwerze programistycznym?

Patrząc na źródło JSONPEncoder wydaje się, że będzie nadal zapisywać komunikat JSON do odpowiedzi, nawet jeśli nie został odebrany parametr "oddzwaniania". Po prostu nie sformatuje wrappera metody JavaScript.

+0

Dzięki, po twoim komentarzu zrobiłem podwójne sprawdzenie, a parametr zapytania zwrotnego jest obecny w obu środowiskach. Należy pamiętać, że w moim lokalnym systemie, kiedy zmieniam konfigurację z httpTransport na HttpsTransport, wyjście staje się regularnym jsonem. –

+0

Dziwne. Powiedziałeś, że uwzględniłeś klasy z próbki. Jeśli umieścisz punkt przerwania w obu metodach WriteMessage w JSONPEncoderFactory, czy którykolwiek z nich zostanie trafiony podczas wykonywania połączenia? –

1

nie jestem 100% pewny odpowiedzi, ale oto kilka rzeczy, które pomogą sprowadzić:

Na początek, jeśli ustawisz ProtectionLevel jawnie albo Zarejestruj lub EncryptAndSign, to musisz użyj wiązania z włączonymi zabezpieczeniami lub zostanie zgłoszony wyjątek. Spowoduje to rozpoczęcie wyrzucania wyjątków, jeśli spróbujesz uzyskać do niego dostęp za pośrednictwem protokołu http, co może pomóc w ustaleniu, w jaki sposób faktycznie uzyskujesz dostęp do usługi.

Po drugie, ponieważ używasz customBinding, musisz powiedzieć mu, jakiego rodzaju zabezpieczenia chcesz powiązać. Nie sądzę, że wystarczy podać tylko httpsTransport. Sposób, w jaki to robisz, to security tag. Z jego brzmienia będziesz musiał ustawić authenticationMode="SspiNegotiated".

Według the custom binding docs

kolejności, w jakiej pojawiają się elementy spraw stosu, ponieważ jest kolejność w których operacje są stosowane do wiadomości.Zalecana kolejność elementów stosu jest następujące:

Transakcje (opcjonalnie)

Reliable Messaging (opcjonalnie)

bezpieczeństwa (opcjonalnie)

transportowa

Encoder (opcjonalnie)

Więcej informacji na temat Cu stom Binding Security here i here Mam nadzieję, że to pomaga.