¿Cómo se especifica requisitos de tipo de notificación en el lado del servicio por lo que serán obedecidas por la petición del cliente?

StackOverflow https://stackoverflow.com/questions/3578560

  •  01-10-2019
  •  | 
  •  

Pregunta

Tengo:

  • Un STS pasivas "solicitud de inicio de sesión", que es también un proveedor de identidad.
  • Un servicio WCF STS activo que puede aceptar y mango Actas fichas
  • Un partido sitio web depender
  • Servicio WCF Una parte que confía que se llama por el sitio web.

Todo esto se junta utilizando Windows Identity Foundation y el código STS personalizado. Active Directory (AD FS) no está involucrado.

Lo que he trabajando ahora es:

  1. intentos de los usuarios a RP visite página de internet.
  2. El usuario se le redirecciona a STS pasivos.
  3. usuario se conecta, se pone una ficha de vuelta emitida, se le redirecciona a la RP sitio web.
  4. RP sitio Web hace una llamada de servicio a la RP WCF y pasa un token de Actas de modo delegación sucede.
  5. STS activos ve las Actas símbolo venir y configura adecuadamente la identidad de salida por lo que la identidad primaria es las Actas de fichas y se añade la identidad de la persona que llama a la cadena Actor.
  6. WCF RP recibe el token adecuado con todo en su lugar, el principal hilo actual tiene la identidad correcta y reclamaciones como debe ser.

Quiero la RP WCF para solicitar reivindicaciones adicionales de los STS activos.

Es decir, en la RST que va a la STS activos, quiero que incluye el pliego de peticiones que el servicio requiere por lo que esas demandas adicionales pueden ser exagerado si no están ya presentes.

He figued la manera de hacer esto modificando la unión en el cliente sitio web RP pero quiero que los requisitos que se especifiquen en el extremo RP servicio WCF.

Tengo la sensación de que tiene algo que ver con la unión que estoy usando. Tuve problemas para conseguir trabajo ws2007FederationHttpBinding con Actas fichas y todos los ejemplos en el kit de entrenamiento de identidad WIF utilizado customBinding, por lo que lo hice, también, y finalmente funcionó. Aquí está el fragmento de configuración de la RP WCF mostrar mi configuración de enlace:

<system.serviceModel>
  <bindings>
    <customBinding>
      <binding name="CustomBinding_FederatedService">
        <security
          authenticationMode="IssuedTokenForCertificate"
          messageSecurityVersion="WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10">
          <issuedTokenParameters tokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1">
            <issuer address="http://localhost:38901/ActiveSts.svc/IWSTrust13" />
            <issuerMetadata address="http://localhost:38901/ActiveSts.svc/mex" />
          </issuedTokenParameters>
        </security>
        <textMessageEncoding>
          <readerQuotas maxArrayLength="32767" />
        </textMessageEncoding>
        <httpTransport />
      </binding>
    </customBinding>
  </bindings>
</system.serviceModel>

Si cambio la configuración en la página web de llamar para indicar claimTypeRequirements en la sección issuedTokenParameters, el STS activas en realidad no ver la lista de declaraciones requeridas en la RST ... pero eso es en el sitio web de la llamada, que es problemático para mí.

¿Cómo puedo hacer que lo que el RP WCF puede especificar demandas adicionales que requiere sin tener que duplicar esa configuración en la página web llamando?

Si lo es, de hecho, un problema de la unión, sería de gran ayuda si usted me puede mostrar la configuración equivalentes en cuanto a lo que tengo arriba. Puedo actualizar el sitio web y el servicio WCF con los cambios apropiados, pero de nuevo, necesito el servicio (o un comportamiento en el servicio, o la configuración del servicio) para controlar el pliego de peticiones que necesita. El servicio no debe aceptar las peticiones que le faltan las reclamaciones necesarias.

¿Fue útil?

Solución

Resulta que el camino que tiene que hacer esto es ...

  1. Figura encontrar una manera de recuperar los requisitos de reclamación en el lado del cliente. Esto podría ser algún tipo de servicio de configuración central, WS-Policy Intercambio de metadatos / o lo que quiera.
  2. crear manualmente la petición de señal de la STS. En lugar de utilizar el método de extensión microsoft.identityModel CreateChannelActingAs(token), solicitar manualmente un Actas de tokens (o un nuevo token) utilizando WSTrustChannelFactory.
  3. Añadir el testigo a los parámetros del canal de salida.
  4. solicitado manualmente

Tenga en cuenta que esto no quita exactamente la necesidad de su cliente para saber acerca de la lista de requisitos de reclamaciones, pero no le dan la posibilidad de centralizar la configuración que de alguna manera, o incluso utilizar el servicio en sí para proporcionar esa lista de requisitos de reclamaciones . No es, por desgracia, no hay nada en la pila microsoft.identityModel que hace todo esto para usted. El cliente tiene absoluta necesidad de conocer la lista de requisitos de reclamaciones debido a que la solicitud de token de seguridad se emite como parte de la comunicación con el cliente, no emitido por el servicio como las solicitudes de operación de servicios entran en juego.

De todos modos, se puede ver algunas explicaciones dignas de WSTrustChannelFactory y WSTrustChannel en el MSDN sitio web. Mi solución se basa en eso.

Reducido sin todo el manejo de errores, etc, básicamente, el código es el siguiente:

// You need the channel factory so you can get info about the endpoint.
var factory = new ChannelFactory<IService>();

// Get the issuedTokenParameters information from the binding.
// You see this in the XML config but it's painful to access.
var tokenParameters = factory.Endpoint.Binding
    .CreateBindingElements()
    .OfType<SecurityBindingElement>().First()
    .EndpointSupportingTokenParameters
    .Endorsing.OfType<IssuedSecurityTokenParameters>().First();

// Prepare the RST.
var trustChannelFactory = new WSTrustChannelFactory(tokenParameters.IssuerBinding, tokenParameters.IssuerAddress);
var trustChannel = (WSTrustChannel)trustChannelFactory.CreateChannel();
var rst = new RequestSecurityToken(RequestTypes.Issue);
rst.AppliesTo = factory.Endpoint.Address;

// If you're doing delegation, set the ActAs value.
var principal = Thread.CurrentPrincipal as IClaimsPrincipal;
var bootstrapToken = principal.Identities[0].BootstrapToken;
rst.ActAs = new SecurityTokenElement(bootstrapToken);

// Here's where you can look up claims requirements dynamically.
rst.Claims.Add(new RequestClaim("http://dynamically-added-claim"));

// Get the token and attach it to the channel before making a request.
RequestSecurityTokenResponse rstr = null;
var issuedToken = trustChannel.Issue(rst, out rstr);
var fccParameters = new FederatedClientCredentialsParameters();
fccParameters.IssuedSecurityToken = issuedToken;
var channel = factory.CreateChannel();
((IChannel)channel).GetProperty<ChannelParameterCollection>().Add(fccParameters);

// NOW you can make the request.
channel.DoWork();

Esto también le permite a la caché que emitió moneda si así lo desea para optimizar algunas de las comunicaciones que fluye alrededor del sistema.

Por supuesto, si usted no está tratando de requisitos de reclamación dinámica de inserción o si eres de otro modo feliz usando la configuración XML y duplicarla en el servidor y el cliente, esto no es necesario. El método de extensión CreateChannelActingAs(token) y toda la pila microsoft.identityModel se encarga de esto para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top