Udostępnij za pośrednictwem


Obsługa zasad

Wsutil przetwarza zasady określone w metadanych wejściowych i generuje procedury pomocnicze na potrzeby obsługi modelu usług.

Jak używać obsługi zasad w narzędziu wsutil

Deweloperzy powinni wykonać następujące kroki, aby użyć obsługi zasad w kompilatorze wsutil:

  • Zbierz wszystkie pliki metadanych wejściowych niezbędnych dla docelowej usługi internetowej.
  • Skompiluj wszystkie zebrane pliki WSDL/XSD/policy przy użyciu wsutil.exe. Narzędzie Wsutil generuje jeden zestaw plików wycinkowych i pliku nagłówkowego dla każdego wejściowego pliku WSDL i XSD.
  • Sprawdź wygenerowany plik nagłówka, wszystkie nazwy procedur pomocnika zasad są wymienione w sekcji komentarza na początku pliku nagłówka.
  • Użyj procedury pomocnika bindingName_CreateServiceProxy, aby utworzyć serwer proxy usługi.
  • Użyj procedury pomocnika bindingName_CreateServiceEndpoint, aby utworzyć punkt końcowy usługi.
  • Wypełnij WS_bindingTemplateType_BINDING_TEMPLATE strukturę określoną w podpisie metody. Deweloperzy mogą udostępniać dodatkowe właściwości kanału i/lub właściwości zabezpieczeń zgodnie z potrzebami.
  • Wywołaj procedury pomocnika po pomyślnym utworzeniu zwrotnego serwera proxy usługi lub punktu końcowego usługi.

W poniższych sekcjach opisano szczegółowo powiązane tematy.

Obsługa danych wejściowych zasad

Poniżej przedstawiono opcje kompilatora związane z przetwarzaniem zasad.

Domyślnie program wsutil zawsze generuje szablony zasad, chyba że jest wywoływany z opcją "/nopolicy". Zasady można osadzać jako część pliku WSDL lub można utworzyć oddzielnie jako plik metadanych zasad, który wsutil przyjmuje jako dane wejściowe. Opcja kompilatora "/wsp:" służy do wskazania, że określone metadane wejściowe są plikiem zasad. Wsutil generuje potencjalnych pomocników związanych z zasadami przy użyciu następującej kompilacji:

wsutil /wsdl:trusted.wsdl /wsdl:trusted1.wsdl

wstuil /wsdl:input.wsdl /wsp:policy.wsp

Żadne pomocniki zasad nie są generowane, gdy opcja "/nopolicy" jest używana jak w poniższym przykładzie.

wsutil /nopolicy /wsdl:trusted.wsdl /wsdl:trusted1.wsdl

mapowanie metadanych na stronie szczegóły mapowania między konstrukcjami metadanych z różnymi typami powiązań.

W ustawieniach zasad można określić trzy kategorie ustawień zasad:

Typ szablonu powiązania

Istnieje ograniczona liczba powiązań obsługiwanych w narzędziu wsutil. Wszystkie te obsługiwane kombinacje tych powiązań są wymienione w definicji WS_BINDING_TEMPLATE_TYPE. Na przykład dla następującego powiązania w pliku wsdl

<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />

Narzędzie Wsutil generuje WS_HTTP_BINDING_TEMPLATE_TYPE typ szablonu powiązania dla tego powiązania.

Opisy zasad

Po ustawieniu zasad wejściowych narzędzie wsutil generuje zestaw opisów zasad opisujących zasady wejściowe, w tym typ szablonu, a także wartości określone w zasadach. Na przykład dla danych wejściowych

<wsdl:binding...>
  <soap11:binding.../> =< WS_ENVELOPE_VERSION_SOAP_1_1
</wsdl:binding>

Wsutil generuje opis właściwości kanału, na przykład:

WS_ENVELOPE_VERSION_SOAP_1_1,
{
  WS_CHANNEL_PROPERTY_ENVELOPE_VERSION,
  (void*)&locaDefinitions.policies.bindHostedClientSoap.envelopeVersion, //points to the WS_ENVELOPE_VERSION_SOAP_1_1 value above
  sizeof(&localDefinitions.policies.bindHostedClientSoap.envelopeVersion),
},

Wszystkie ustawienia zasad (właściwości kanału, właściwości zabezpieczeń i właściwości powiązania zabezpieczeń) w jednym powiązaniu są agregowane w jedną strukturę WS_bindingTemplateType_POLICY_DESCRIPTION. WS_BINDING_TEMPLATE_TYPE określa różne kombinacje zasad powiązań wsutil obsługuje.

Struktura szablonu do wypełnienia przez aplikację

Opis zasad zawiera wszystkie informacje o zasadach określone w metadanych wejściowych dla danego powiązania, ale istnieją informacje, które nie mogą być reprezentowane w zasadach, ale wymagają danych wejściowych użytkownika podczas korzystania z tych ustawień zasad w celu utworzenia serwera proxy usługi i/lub punktu końcowego usługi. Na przykład aplikacja musi podać poświadczenia na potrzeby uwierzytelniania nagłówka HTTP.

Aplikacja musi wypełnić strukturę szablonu o nazwie WS_bindingTemplateType_BINDING_TEMPLATE dla każdego innego typu szablonu powiązania zdefiniowanego w pliku webservices.h:

struct WS_bindingTemplateType_BINDING_TEMPLATE
{
  WS_CHANNEL_PROPERTIES channelProperties;
  WS_SECURITY_PROPERTIES securityProperties;
  possible_list_of_SECURITY_BINDING_TEMPLATEs;
  ...
};

Lista szablonów powiązań zabezpieczeń jest opcjonalna, zależy od dopasowanego powiązania zabezpieczeń. Na przykład pole WS_SSL_TRANSPORT_SECURITY_BINDING_TEMPLATE jest prezentowane w WS_HTTP_SSL_BINDING_TEMPLATE, aby aplikacja dostarczała powiązane z protokołem SSL informacje o powiązaniu z zabezpieczeniami, w tym informacje o poświadczeniach.

Aplikacja musi wypełnić wszystkie pola w tej strukturze przed wywołaniem interfejsów API szablonów usług internetowych. Dodatkowe właściwości zabezpieczeń, a także właściwości powiązania zabezpieczeń, które nie są godne reprezentowania w zasadach, należy wypełnić, a interfejsy API usług internetowych scalają dwa zestaw właściwości w środowisku uruchomieniowym. Jeśli nie ma zastosowania, pola mogą być wyzerowane. Na przykład właściwości securityProperties mogą być zerowe, jeśli nie są potrzebne żadne dodatkowe właściwości zabezpieczeń.

Procedury pomocnika i deklaracja opisu zasad w plikach nagłówków

narzędzie wsutil tworzy procedurę pomocnika, aby ułatwić lepszą obsługę warstwy modelu usług, dzięki czemu aplikacja może łatwiej tworzyć serwer proxy usługi i punkt końcowy usługi. Opis zasad jest również uwidoczniony, tak aby aplikacja mogła ich używać bezpośrednio. Procedury pomocy CreateSerivceProxy wyglądają następująco:

HRESULT bindingName_CreateServiceProxy(
  __in_ecount_opt(propertyCount) const WS_PROXY_PROPERTY* properties,
  __in const ULONG propertyCount,
  __in WS_constraintName_BINDING_TEMPLATE* templateValue,
  __deref_out WS_SERVICE_PROXY** serviceProxy,
  __in_opt WS_ERROR* error);

Deweloperzy są zachęcani do korzystania z tych procedur pomocników, choć mogą również bezpośrednio korzystać z procedury środowiska uruchomieniowego poniżej zapewnianych przez webservices.dll. Deweloperzy nie są zachęcani do bezpośredniego używania opisów zasad podczas programowania przy użyciu modelu usługi warstwy.

Odwołania do opisu zasad są również generowane w nagłówku dla zaawansowanego użytkownika. Jeśli deweloperzy nie korzystają z funkcji modelu usług, mogą bezpośrednio używać opisów zasad.

struct {
  ...
  struct {
    ...
    } contracts;
  struct {
    WS_bindingTemplateType_POLICY_DESCRIPTION bindingName;
    ...
    } policies;
  }

Prototypy definicji w plikach wycinków

Jedno pole struktury opisu zasad na powiązanie i jego wewnętrznie przywoływały opisy pomocnika są tworzone w lokalnej strukturze prototypu. Opisy zasad są generowane w pliku, w którym jest generowany WS_CONTRACT_DESCRIPTION. Ogólnie rzecz biorąc, deweloperzy nie muszą sprawdzać pliku wycinkowego podczas programowania, chociaż plik wycinkowy zawiera wszystkie szczegóły dotyczące specyfikacji zasad.

struct {
  ...
  struct {
  ... } contracts;
  ...
 struct {
      struct {
        hierarchy of policy template descriptions;
        } bindingName;
      ...
      list of bindings in the input wsdl file.
  } policies;
} fileNameLocalDefinitions;

Implementacja procedur pomocnika w plikach wycinków

Wsutil generuje procedury pomocnicze, aby uprościć wywołania aplikacji do WsCreateServiceProxy i tworząc WS_SERVICE_ENDPOINT oparte na informacjach podanych w ustawieniach zasad.

Zależy od ograniczeń powiązań określonych dla danego portu, pierwszy argument różni się w zależności od struktury szablonu. W poniższym przykładzie przyjęto założenie, że transport HTTP, podpis tworzenia serwera proxy usługi jest podobny z jednym dodatkowym parametrem typu kanału.

HRESULT bindingName_CreateServiceProxy(
    __in WS_bindingTemplateType_BINDING_TEMPLATE* templateValue,
    __in_ecount_opt(propertyCount) const WS_PROXY_PROPERTY* properties,
    __in const ULONG propertyCount,
    __deref_out WS_SERVICE_PROXY** serviceProxy,
    __in_opt WS_ERROR* error)
{
    return WsCreateServiceProxyFromTemplate(
      WS_CHANNEL_TYPE_REQUEST,    // this is fixed for http, requires input for TCP
      properties,     
      propertyCount, 
      WS_bindingTemplateType_BINDING_TEMPLATE_TYPE,
      templateValue,
      sizeof(WS_bindingTemplateType_BINDING_TEMPLATE),  
      &fileName.policies.bindingName,   // template description as generated in the stub file
      sizeof(WS_constraintName_POLICY_DESCRIPTION),
      serviceProxy,     
      error);     
}
HRESULT bindingName_CreateServiceEndpoint(
__in WS_bindingTemplateType_BINDING_TEMPLATE* templateValue,
__in_opt const WS_STRING* addressUrl,
__in bindingNameFunctionTable* functionTable,
__in WS_SERVICE_SECURITY_CALLBACK authorizationCallback,
__in const WS_SERVICE_ENDPOINT_PROPERTY* properties,
__in ULONG propertyCount,
__in WS_HEAP* heap,
  __deref_out WS_SERVICE_ENDPOINT** serviceEndpoint,
  __in_opt WS_ERROR* error)
{
  WS_SERVICE_CONTRACT serviceContract;
  serviceContract.contractDescription = &fileName.contracts.bindingName;
  serviceContract.defaultMessageHandlerCallback = NULL;
  serviceContract.methodTable = (const void *)functionTable;

  return WsCreateServiceEndpointFromTemplate(
      properties,
      propertyCount,
      addressUrl,    // service endpoint address
      WS_CHANNEL_TYPE_RESPONSE,    // this is fixed for http, requires input for TCP
      &serviceContract,
      authorizationCallback,
      heap,
      WS_bindingTemplateType_BINDING_TEMPLATE_TYPE,
      templateValue,
      sizeof(WS_bindingTemplateType_BINDING_TEMPLATE),
      &fileName.policies.bindingName,   // template description as generated in the stub file
      sizeof(WS_bindingTemplateType_POLICY_DESCRIPTION),
      serviceEndpoint,
      error);
}

Obsługiwane ustawienia zasad

W poniższej tabeli wymieniono wszystkie obsługiwane typy szablonów powiązań, pasujące powiązania zabezpieczeń wymagane w typie, strukturę szablonu, która ma zostać wypełniona przez aplikację dla typu i pasujący typ opisu. Aplikacja musi wypełnić strukturę szablonu, podczas gdy deweloper aplikacji powinien zrozumieć, jakie powiązania zabezpieczeń są wymagane w danych zasadach.

WS_BINDING_TEMPLATE_TYPE Kombinacje powiązań zabezpieczeń Struktura szablonu do wypełnienia przez aplikację opis zasad
WS_HTTP_BINDING_TEMPLATE_TYPE WS_HTTP_BINDING_TEMPLATE WS_HTTP_POLICY_DESCRIPTION
WS_HTTP_SSL_BINDING_TEMPLATE_TYPE WS_SSL_TRANSPORT_SECURITY_BINDING WS_HTTP_SSL_BINDING_TEMPLATE WS_HTTP_SSL_POLICY_DESCRIPTION
WS_HTTP_HEADER_AUTH_BINDING_TEMPLATE_TYPE WS_HTTP_HEADER_AUTH_SECURITY_BINDING WS_HTTP_HEADER_AUTH_BINDING_TEMPLATE WS_HTTP_HEADER_AUTH_POLICY_DESCRIPTION
WS_HTTP_SSL_HEADER_AUTH_BINDING_TEMPLATE_TYPE WS_SSL_TRANSPORT_SECURITY_BINDING i WS_HTTP_HEADER_AUTH_SECURITY_BINDING WS_HTTP_SSL_HEADER_AUTH_BINDING_TEMPLATE WS_HTTP_SSL_HEADER_AUTH_POLICY_DESCRIPTION
WS_HTTP_SSL_USERNAME_BINDING_TEMPLATE_TYPE WS_SSL_TRANSPORT_SECURITY_BINDING i WS_USERNAME_MESSAGE_SECURITY_BINDING WS_HTTP_SSL_USERNAME_BINDING_TEMPLATE WS_HTTP_SSL_USERNAME_POLICY_DESCRIPTION
WS_HTTP_SSL_KERBEROS_APREQ_BINDING_TEMPLATE_TYPE WS_SSL_TRANSPORT_SECURITY_BINDING i WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING WS_HTTP_SSL_KERBEROS_APREQ_BINDING_TEMPLATE WS_HTTP_SSL_KERBEROS_APREQ_POLICY_DESCRIPTION
WS_TCP_BINDING_TEMPLATE_TYPE WS_TCP_BINDING_TEMPLATE WS_TCP_POLICY_DESCRIPTION
WS_TCP_SSPI_BINDING_TEMPLATE_TYPE WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING WS_TCP_SSPI_BINDING_TEMPLATE WS_TCP_SSPI_POLICY_DESCRIPTION
WS_TCP_SSPI_USERNAME_BINDING_TEMPLATE_TYPE WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING i WS_USERNAME_MESSAGE_SECURITY_BINDING WS_TCP_SSPI_USERNAME_BINDING_TEMPLATE WS_TCP_SSPI_USERNAME_POLICY_DESCRIPTION
WS_TCP_SSPI_KERBEROS_APREQ_BINDING_TEMPLATE_TYPE WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING i WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING WS_TCP_SSPI_KERBEROS_APREQ_BINDING_TEMPLATE WS_TCP_SSPI_KERBEROS_APREQ_POLICY_DESCRIPTION
WS_HTTP_SSL_USERNAME_SECURITY_CONTEXT_BINDING_TEMPLATE_TYPE WS_SSL_TRANSPORT_SECURITY_BINDING i WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING z WS_USERNAME_MESSAGE_SECURITY_BINDING w kanale bootstrap WS_HTTP_SSL_USERNAME_SECURITY_CONTEXT_BINDING_TEMPLATE WS_HTTP_SSL_USERNAME_SECURITY_CONTEXT_POLICY_DESCRIPTION
WS_HTTP_SSL_KERBEROS_APREQ_SECURITY_CONTEXT_BINDING_TEMPLATE_TYPE WS_SSL_TRANSPORT_SECURITY_BINDING i WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING z WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING w kanale bootstrap WS_HTTP_SSL_KERBEROS_APREQ_SECURITY_CONTEXT_BINDING_TEMPLATE WS_HTTP_SSL_KERBEROS_APREQ_SECURITY_CONTEXT_POLICY_DESCRIPTION
WS_TCP_SSPI_USERNAME_SECURITY_CONTEXT_BINDING_TEMPLATE_TYPE WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING i WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING za pomocą WS_USERNAME_MESSAGE_SECURITY_BINDING w kanale bootstrap WS_TCP_SSPI_USERNAME_SECURITY_CONTEXT_BINDING_TEMPLATE WS_TCP_SSPI_USERNAME_SECURITY_CONTEXT_POLICY_DESCRIPTION
WS_TCP_SSPI_KERBEROS_APREQ_SECURITY_CONTEXT_BINDING_TEMPLATE_TYPE WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING i WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING z WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING w kanale bootstrap WS_TCP_SSPI_KERBEROS_APREQ_SECURITY_CONTEXT_BINDING_TEMPLATE WS_TCP_SSPI_KERBEROS_APREQ_SECURITY_CONTEXT_POLICY_DESCRIPTION

 

Na przykład WS_HTTP_SSL_BINDING_TEMPLATE_TYPE wskazuje zasady wejściowe powiązania określają transport HTTP i WS_SSL_TRANSPORT_SECURITY_BINDING. Aplikacja musi wypełnić strukturę WS_HTTP_SSL_BINDING_TEMPLATE przed wywołaniem procedur pomocnika, a zgodny opis zasad jest WS_HTTP_SSL_POLICY_DESCRIPTION. W szczególności sekcja powiązania w języku WSDL zawiera następujące segmenty:

<wsp:Policy...>
  <sp:TransportBinding...>
    <wsp:Policy...>
      <sp:TransportToken...>
        <wsp:Policy...>
          <sp:HttpsToken.../>
        </wsp:Policy...>
      </sp:TransportToken...>
    </wsp:Policy>
  </sp:TransportBinding...>
</wsp:Policy>
<wsdl:binding...>
<soap11:binding.../> => WS_ENVELOPE_VERSION_SOAP_1_1
</wsdl:binding>

Obsługa kontekstu zabezpieczeń

W kontekst zabezpieczeńkanał bootstrap jest tworzony w celu ustanowienia bezpiecznej konwersacji w kanale usługi. Wsutil obsługuje tylko scenariusz, w którym kanał bootstrap jest taki sam jak kanał usługi, z tymi samymi właściwościami kanału i właściwościami zabezpieczeń. Zabezpieczenia transportu są wymagane do powiązania komunikatów kontekstowych zabezpieczeń; Program wsutil obsługuje kanały bootstrap z innymi powiązaniami zabezpieczeń komunikatów, ale obsługują tylko kontekst zabezpieczeń jako jedyne powiązanie zabezpieczeń komunikatów w kanale usługi bez kombinacji z innymi powiązaniami zabezpieczeń komunikatów. Deweloperzy mogą obsługiwać te kombinacje poza obsługą szablonów zasad.

Następujące wyliczenie jest częścią obsługi zasad:

Następujące funkcje są częścią obsługi zasad:

Następujące struktury są częścią obsługi zasad: