WCF - Credenciales personalizadas y tokens de seguridad

Soy bastante nuevo en el desarrollo de WCF y me he encontrado con un par de problemas al aprender el marco. Tengo una API de servicio que debe ser compatible con REST y SOAP. Hasta ahora, esto ha sido fácil de implementar, especialmente con WCF4 y enrutamiento.

Actualmente estoy trabajando en la autorización y he logrado ampliar AuthorizationManager creando dos nuevas clases de administrador: "ApiKeyAuthorizationManager" y "ApiKeyAndTokenAuthorizationManager"

La mayoría de mis servicios requerirán una ApiKey y Token (GUID) para estar presente; cuando se autentica inicialmente, simplemente necesita una ApiKey y una contraseña válidas para recibir un token.

Hasta ahora, REST funciona perfectamente, ya que los gerentes de autorización buscan la cadena de consulta para obtener ApiKey y / o Token.

Entonces, por ejemplo, un uri de servicio se vería así: *http://api.domain.com/Service/Operation/{someVariableValue}? ApiKey = GUID & Token = GUID

Mi problema ahora viene con la autorización de llamadas al servicio SOAP. He investigado un poco y he llegado a algunas conclusiones que quería verificar que son correctas antes de implementar.

Para autorizar SOAP con credenciales personalizadas, debería:

Crear token de servicio personalizado (MSDN)Extienda WCF creando un SecurityTokenProvider personalizado, SecurityTokenAuthenticator y SecurityTokenSerializer (MSDN)Extienda WCF creando AuthorizationPolicies personalizadas (MSDN)

¿Estoy en el camino correcto para esto? ¿Todos estos pasos son necesarios para mi escenario? Parece tanta personalización solo para verificar una credencial compuesta por dos GUID.

¡Gracias!

[EDITAR # 1]

Esta ha sido una tarea muy difícil. Las credenciales personalizadas y los tokens de seguridad están casi indocumentados. Encontrar publicaciones de blog de calidad en sí ha resultado casi imposible. Me he estado desconectando y estoy tan cerca de tener una solución que funcione. Incluso me he topado con los mismos obstáculos como se describe enesta publicación.

Cuando intento acceder a mi servicio para descubrir wsdl o mex, recibo este error:

<pre>The service encountered an error. An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is: System.InvalidOperationException: An exception was thrown in a call to a policy export extension. Extension: System.ServiceModel.Channels.SymmetricSecurityBindingElement Error: Specified argument was out of the range of valid values. Parameter name: parameters ----> System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. Parameter name: parameters at System.ServiceModel.Security.WSSecurityPolicy.CreateTokenAssertion(MetadataExporter exporter, SecurityTokenParameters parameters, Boolean isOptional) at System.ServiceModel.Security.WSSecurityPolicy.CreateWsspSignedSupportingTokensAssertion(MetadataExporter exporter, Collection`1 signed, Collection`1 signedEncrypted, Collection`1 optionalSigned, Collection`1 optionalSignedEncrypted) at System.ServiceModel.Security.WSSecurityPolicy.CreateWsspSupportingTokensAssertion(MetadataExporter exporter, Collection`1 signed, Collection`1 signedEncrypted, Collection`1 endorsing, Collection`1 signedEndorsing, Collection`1 optionalSigned, Collection`1 optionalSignedEncrypted, Collection`1 optionalEndorsing, Collection`1 optionalSignedEndorsing, AddressingVersion addressingVersion) at System.ServiceModel.Security.WSSecurityPolicy.CreateWsspSupportingTokensAssertion(MetadataExporter exporter, Collection`1 signed, Collection`1 signedEncrypted, Collection`1 endorsing, Collection`1 signedEndorsing, Collection`1 optionalSigned, Collection`1 optionalSignedEncrypted, Collection`1 optionalEndorsing, Collection`1 optionalSignedEndorsing) at System.ServiceModel.Channels.SecurityBindingElement.ExportSymmetricSecurityBindingElement(SymmetricSecurityBindingElement binding, MetadataExporter exporter, PolicyConversionContext policyContext) at System.ServiceModel.Channels.SecurityBindingElement.ExportPolicy(MetadataExporter exporter, PolicyConversionContext context) at System.ServiceModel.Description.MetadataExporter.ExportPolicy(ServiceEndpoint endpoint) --- End of inner ExceptionDetail stack trace --- at System.ServiceModel.Description.ServiceMetadataBehavior.MetadataExtensionInitializer.GenerateMetadata() at System.ServiceModel.Description.ServiceMetadataExtension.EnsureInitialized() at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.InitializationData.InitializeFrom(ServiceMetadataExtension extension) at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.GetInitData() at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.TryHandleDocumentationRequest(Message httpGetRequest, String[] queries, Message& replyMessage) at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.ProcessHttpRequest(Message httpGetRequest) at SyncInvokeGet(Object , Object[] , Object[] ) at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) </pre>

Si tienes alguna idea de lo que podría estar causando esto, me encantaría recibir ayuda.

[EDITAR # 2]

Parece que Microsoft no quiere actualizar sus muestras para mostrar cómo permitir el soporte de wsdl para credenciales / tokens personalizados.Mira aquí. ¿Alguien tiene una idea de cómo hacer que esto funcione? ¿Cuál es el punto de hacer que un marco sea extensible si no hay documentación sobre cómo extenderlo?

[EDITAR # 3]

Como se indica en mi comentario a continuación ... Tengo TransportWithMessageCredential funcionando bien usando UserNameSecurityToken. Desafortunadamente, mis servicios terminarán requiriendo tokens personalizados cuando sea el momento de implementar algunas características más avanzadas que he planeado.

Lo que estoy buscando como respuesta sería:

Cómo admitir credenciales y tokens de servicios personalizadoscon Soporte WSDL?

Actualmente, siguiendo los ejemplos de Microsoft, solo puede usar credenciales personalizadas utilizando ChannelFactory y creando un enlace personalizado en el cliente. Prefiero no lidiar con eso.

Si esta pregunta sigue sin respuesta, seguiré aumentando la recompensa. Tan pronto como pueda hacer que todo funcione, escribiré un tutorial de blog sobre todos los pasos necesarios para crear una solución de seguridad personalizada.

Respuestas a la pregunta(1)

Su respuesta a la pregunta