Я довольно новичок в разработке 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&Token=GUID
Теперь моя проблема связана с авторизацией вызовов службы SOAP. Я провел небольшое исследование и пришел к нескольким выводам, которые я хотел проверить, перед тем, как приступить к реализации.
Чтобы авторизовать SOAP с пользовательскими учетными данными, мне нужно:
- Создание токена пользовательской службы ( MSDN )
- Расширение WCF путем создания настраиваемого SecurityTokenProvider, SecurityTokenAuthenticator и SecurityTokenSerializer ( MSDN )
- Расширение WCF путем создания пользовательских политик авторизации ( MSDN )
Я на правильном пути для этого? Все ли эти шаги необходимы, чтобы соответствовать моему сценарию? Похоже, так много настроек просто для проверки учетных данных, состоящих из двух GUID.
Спасибо!
[РЕДАКТИРОВАТЬ # 1]
Это было очень сложное задание. Пользовательские учетные данные и токены безопасности практически не документированы. Найти качественные сообщения в блоге оказалось практически невозможно. Я продолжал подключаться и так близко, чтобы иметь рабочее решение. Я даже наткнулся на те же дорожные блоки, как описано в этом посте .
Когда я пытаюсь получить доступ к своему сервису для обнаружения wsdl или mex, я получаю эту ошибку:
</p>
<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>
<p>
Если вы знаете, что может быть причиной этого, я бы хотел помочь.
[РЕДАКТИРОВАТЬ # 2]
Кажется, Microsoft не хочет обновлять свои образцы, чтобы показать, как разрешить поддержку wsdl для пользовательских учетных данных / токенов. Смотрите здесь .
У кого-нибудь есть идея, как заставить это работать? Какой смысл делать фреймворк расширяемым, если нет документации, как его расширить?!?
[РЕДАКТИРОВАТЬ # 3]
Как указано в моем комментарии ниже ...
У меня TransportWithMessageCredential работает нормально, используя UserNameSecurityToken. К сожалению, моим службам потребуются пользовательские токены, когда придет время реализовать некоторые более сложные функции, которые я запланировал.
То, что я ищу в качестве ответа, будет:
Как поддерживать учетные данные и токены пользовательских служб с поддержкой WSDL?
В настоящее время, следуя примерам Microsoft, вы можете использовать только пользовательские учетные данные, используя ChannelFactory и создавая пользовательскую привязку на клиенте. Я бы предпочел не иметь с этим дело.
Если этот вопрос останется без ответа, я буду продолжать увеличивать награду. Как только я смогу все это заработать, я напишу учебник по блогам обо всех шагах, необходимых для создания специального решения безопасности.