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 и создавая пользовательскую привязку на клиенте. Я бы предпочел не иметь дело с этим.
Если этот вопрос останется без ответа, я буду продолжать увеличивать награду. Как только я смогу все это заработать, я напишу учебник для блога обо всех шагах, необходимых для создания специального решения безопасности.