WCF - Пользовательские учетные данные и токены безопасности

Я довольно новичок в разработке WCF и столкнулся с парой проблем при изучении фреймворка. У меня есть сервис API, который должен поддерживать как REST & SOAP. До сих пор это было легко реализовать, особенно с помощью WCF4 и маршрутизации.

В настоящее время я работаю над авторизацией и смог расширить AuthorizationManager, создав два новых класса менеджера: «ApiKeyAuthorizationManager» и «ApiKeyAndTokenAuthorizationManager»

Для большинства моих услуг требуются ApiKey и Token (GUIDS); при первоначальной аутентификации вам просто нужен действующий ApiKey и пароль для получения токена.

Пока что REST работает отлично, поскольку администраторы авторизации обращаются к строке запроса, чтобы получить ApiKey и / или Token.

Так, например, сервис URI будет выглядеть так: *http://api.domain.com/Service/Operation/{} SomeVariableValue? ApiKey = идентификатор GUID = & маркеров GUID

Теперь моя проблема связана с авторизацией вызовов сервисов SOAP. Я провел небольшое исследование и пришел к нескольким выводам, которые я хотел проверить, перед тем, как приступить к реализации.

Чтобы авторизовать SOAP с пользовательскими учетными данными, я должен:

Создать персонализированный сервисный токен (MSDN)Расширьте WCF, создав пользовательский SecurityTokenProvider, SecurityTokenAuthenticator и SecurityTokenSerializer (MSDN)Расширьте WCF, создавая пользовательские политики авторизации (MSDN)

Я на правильном пути для этого? Все ли эти шаги необходимы, чтобы соответствовать моему сценарию? Похоже, так много настроек просто для проверки учетных данных, состоящих из двух GUID.

Спасибо!

[РЕДАКТИРОВАТЬ # 1]

Это была очень сложная задача. Пользовательские учетные данные и токены безопасности практически не документированы. Найти качественные сообщения в блоге оказалось практически невозможно. Я продолжал подключаться и так близко, чтобы иметь рабочее решение. Я даже столкнулся с теми же препятствиями, как описано вэта почта.

Когда я пытаюсь получить доступ к своему сервису, чтобы раскрыть wsdl или mex, я получаю эту ошибку:

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

Если у вас есть идеи, что может быть причиной этого, я бы хотел помочь.

[РЕДАКТИРОВАТЬ # 2]

Похоже, Microsoft не хочет обновлять свои образцы, чтобы показать, как разрешить поддержку wsdl для пользовательских учетных данных / токенов.Посмотреть здесь, У кого-нибудь есть идея, как заставить это работать? Какой смысл делать расширяемый фреймворк, если нет документации, как его расширить?!?

[РЕД. № 3]

Как указано в моем комментарии ниже ... У меня есть TransportWithMessageCredential, работающий просто отлично, используя UserNameSecurityToken. К сожалению, моим службам потребуются пользовательские токены, когда придет время реализовать некоторые более сложные функции, которые я запланировал.

То, что я ищу в качестве ответа, будет:

Как поддерживать пользовательские учетные данные и токены службыс Поддержка WSDL?

В настоящее время, следуя примерам Microsoft, вы можете использовать только пользовательские учетные данные, используя ChannelFactory и создавая пользовательскую привязку на клиенте. Я бы предпочел не иметь дело с этим.

Если этот вопрос останется без ответа, я буду продолжать увеличивать награду. Как только я смогу все это заработать, я напишу учебник для блога обо всех шагах, необходимых для создания специального решения безопасности.

Ответы на вопрос(1)

Ваш ответ на вопрос