2010-11-11 16 views
5

Soy bastante nuevo en el desarrollo de WCF y he tenido algunos problemas mientras aprendía el framework. Tengo una API de servicio que debe ser compatible con REST & SOAP. Hasta ahora, esto ha sido fácil de implementar, especialmente con WCF4 y el enrutamiento.WCF - Credenciales personalizadas y tokens de seguridad

Actualmente estoy trabajando sobre la autorización y han logrado extender AuthorizationManager mediante la creación de dos nuevas clases Manager: "ApiKeyAuthorizationManager" & "ApiKeyAndTokenAuthorizationManager"

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

Hasta el momento REST funciona a la perfección ya que los administradores de autorización miran la cadena de consulta para obtener ApiKey y/o Token.

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

Mi problema ahora viene con autorizar las llamadas de servicio SOAP. Investigué un poco y he llegado a algunas conclusiones que quería verificar son correctas antes de implementarlas.

Para autorizar SOAP con credenciales personalizadas que debería:

  1. Crear token de servicio personalizado (MSDN)
  2. Ampliar WCF mediante la creación de una costumbre SecurityTokenProvider, SecurityTokenAuthenticator y SecurityTokenSerializer (MSDN)
  3. Extend WCF mediante la creación de AuthorizationPolicies personalizadas (MSDN)

¿Estoy en el camino correcto para esto? ¿Son necesarios todos estos pasos para mi situación? Parece tanta personalización para simplemente verificar una credencial compuesta por dos GUID.

Gracias!


[editar # 1]

Ésta ha sido una tarea muy difícil. Las credenciales personalizadas y los tokens de seguridad casi no están documentados. Encontrar publicaciones de blog de calidad en sí mismo ha resultado casi imposible. He seguido enchufado y estoy tan cerca de tener una solución funcional. Incluso he golpeado los mismos bloques de la carretera como se describe en this post.

cuando intento acceder a mi servicio para descubrir el WSDL o mex recibo este error:

 
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) 

Si tienes alguna idea de lo que podría estar causando esto me gustaría un poco de ayuda.


[editar # 2]

Parece Microsoft no quiere actualizar sus muestras para mostrar cómo permitir el apoyo WSDL para credenciales personalizadas/fichas. See here. ¿Alguien tiene una idea de cómo hacerlo funcionar? ¿De qué sirve ampliar un marco si no hay documentación sobre cómo ampliarlo?!?


[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 planificado.

Lo que estoy buscando como una respuesta sería:

cómo apoyar a las credenciales de servicios personalizados y fichas con el apoyo WSDL?

Actualmente, siguiendo los ejemplos de Microsoft, solo puede usar credenciales personalizadas utilizando ChannelFactory y creando un enlace personalizado en el cliente. Preferiría 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.

+0

Bueno, estoy en el camino correcto, sin embargo, esta es un área muy indocumentada en WCF que me parece sorprendente. Puede seguir los artículos de MSDN mencionados anteriormente pero MS también proporciona los archivos de solución para ir junto con ellos aquí: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=35ec8682-d5fd-4bc3-a51a -d8ad115a8792 & displaylang = es – Daniel

+0

Llegué a la conclusión de que el retorno de la inversión en la creación de credenciales y tokens personalizados no justifica la cantidad de tiempo que dedico a esto. Esperemos que en el futuro, MS se acerque con un mejor apoyo en esta área. He decidido hacer lo que pueda con el tipo de credencial del mensaje Nombre de usuario. Dejaré esta pregunta abierta para responder y recompensaré la recompensa si alguien todavía puede resolverla. – Daniel

+0

UserNameSecurityToken funciona solo por ahora, aunque terminaré requiriendo tokens personalizados cuando sea el momento de implementar algunas funciones más avanzadas que he planificado. Lo que estoy buscando como respuesta sería "Cómo admitir credenciales de servicio personalizado y tokens con soporte WSDL". Si esta pregunta sigue sin respuesta, seguiré aumentando la recompensa. – Daniel

Respuesta

5

Le aconsejaría que busque en Windows Identity Foundation y avance en la dirección de seguridad/federación basada en reclamos. Este modelo admite credenciales personalizadas mucho mejor, ya que son solo un conjunto diferente de notificaciones.

+0

He estado aprendiendo WIF y he leído el libro de Vittorio Bertocci sobre el tema. Sin embargo, no estoy seguro de que sea necesario crear mi propio IdP de STS aquí. Definitivamente considerará esto como una opción. Muchas gracias por tu aporte. – Daniel

Cuestiones relacionadas