WCF - Credenciais personalizadas e tokens de segurança

Sou bastante novo no desenvolvimento do WCF e encontrei alguns problemas enquanto aprendia a estrutura. Eu tenho uma API de serviço que deve suportar REST e SOAP. Até agora, isso foi fácil de implementar, especialmente com o WCF4 e o roteamento.

Atualmente, estou trabalhando na autorização e consegui estender o AuthorizationManager criando duas novas classes de gerenciador: "ApiKeyAuthorizationManager" e "ApiKeyAndTokenAuthorizationManager"

A maioria dos meus serviços exigirá a presença de um ApiKey e Token (GUIDS); ao se autenticar inicialmente, você simplesmente precisa de um ApiKey e senha válidos para receber um token.

Até agora, o REST está funcionando perfeitamente, conforme os gerentes de autorização procuram a sequência de consultas para obter ApiKey e / ou token.

Assim, por exemplo, uma uri de serviço seria semelhante a: *http://api.domain.com/Service/Operation/{someVariableValue}? ApiKey = GUID & Token = GUID

Meu problema agora vem com a autorização de chamadas de serviço SOAP. Pesquisei um pouco e cheguei a algumas conclusões que gostaria de verificar se estão corretas antes da implementação.

Para autorizar o SOAP com credenciais personalizadas, devo:

Crie um token de serviço personalizado (MSDN)Estenda o WCF criando um SecurityTokenProvider, SecurityTokenAuthenticator e SecurityTokenSerializer (MSDN)Estenda o WCF criando AuthorizationPolicies personalizadas (MSDN)

Estou no caminho certo para isso? Todas essas etapas são necessárias para se ajustar ao meu cenário? Parece muita personalização para apenas verificar uma credencial composta de dois GUIDs.

Obrigado!

[EDIT # 1]

Esta tem sido uma tarefa muito difícil. Credenciais personalizadas e tokens de segurança são quase não documentados. Encontrar posts de qualidade em si se mostrou quase impossível. Eu continuei me desconectando e estou tão perto de ter uma solução que funcione. Até cheguei aos mesmos obstáculos descritos emesta postagem.

Quando tento acessar meu serviço para descobrir o wsdl ou mex, recebo este erro:

<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>

Se você tem alguma idéia do que pode estar causando isso, eu gostaria de alguma ajuda.

[EDIT # 2]

Parece que a Microsoft não deseja atualizar seus exemplos para mostrar como permitir o suporte wsdl para credenciais / tokens personalizados.Veja aqui. Alguém tem uma idéia de como fazer isso funcionar? Qual é o sentido de tornar uma estrutura extensível se não houver documentação sobre como estendê-la?!?

[EDIT # 3]

Conforme declarado no meu comentário abaixo ... Tenho TransportWithMessageCredential funcionando perfeitamente usando UserNameSecurityToken. Infelizmente, meus serviços acabam exigindo tokens personalizados quando é hora de implementar alguns recursos mais avançados que planejei.

O que eu estou procurando como resposta seria:

Como dar suporte a credenciais e tokens de serviço personalizadocom Suporte WSDL?

Atualmente, seguindo os exemplos da Microsoft, você só pode usar credenciais personalizadas usando ChannelFactory e criando uma ligação personalizada no cliente. Prefiro não lidar com isso.

Se essa pergunta permanecer sem resposta, continuarei aumentando a recompensa. Assim que eu conseguir que tudo funcione, escreverei um tutorial de blog sobre todas as etapas necessárias para criar uma solução de segurança personalizada.

questionAnswers(1)

yourAnswerToTheQuestion