Я довольно новичок в разработке WCF и столкнулся с несколькими проблемами, изучая фреймворк. У меня есть служба api, которая должна поддерживать как REST & SOAP. До сих пор это было легко реализовать особенно с WCF4 и маршрутизацией.WCF - пользовательские учетные данные и маркеры безопасности
В настоящее время я работаю над авторизацией и удался расширить AuthorizationManager путем создания двух новых классов менеджера: «ApiKeyAuthorizationManager» & «ApiKeyAndTokenAuthorizationManager»
Большинство моих услуг потребуют ApiKey и лексем (Guids) присутствовать ; при первоначальной аутентификации вам просто нужен действительный ApiKey и пароль для получения Token.
Пока что REST работает отлично, поскольку менеджеры авторизации обращаются к строке запроса, чтобы получить ApiKey и/или токен.
Так, например, URI службы будет выглядеть: * http://api.domain.com/Service/Operation/ {someVariableValue} ApiKey = GUID & Токен = GUID
Моя проблема теперь поставляется с санкционирования вызовов SOAP услуг. Я провел немного исследований и пришел к нескольким выводам, которые я хотел проверить, правильные до внедрения.
Для авторизации SOAP с пользовательскими учетными данными я должен:
- Создать маркер (MSDN)
- пользовательские службы Продлить WCF путем создания пользовательских SecurityTokenProvider, SecurityTokenAuthenticator и SecurityTokenSerializer (MSDN)
- Продлить WCF путем создания пользовательских лицензий авторизации (MSDN)
Я на правильном пути для этого? Все эти шаги необходимы для моего сценария? Кажется, так много настроек для просто проверки учетных данных, состоящих из двух GUID.
Спасибо!
[EDIT # 1]
Это было очень трудной задачей. Пользовательские учетные данные и токены безопасности почти недокументированы. Найти качественные сообщения в блоге оказалось практически невозможным. Я продолжал подключаться и так близко, чтобы иметь рабочее решение. Я даже попал в одни и те же дорожные блоки, как описано в this post.
Когда я пытаюсь получить доступ к моей службе, чтобы раскрыть или MEX WSDL я получаю эту ошибку:
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)
Если у вас есть какие-либо идеи, что может быть причиной этого я хотел бы некоторую помощь.
[EDIT # 2]
Кажется, Microsoft не хочет, чтобы обновить свои образцы, чтобы показать, как разрешить поддержку WSDL для пользовательских учетных данных/токенов. See here. У кого-нибудь есть идея, как заставить это работать? Какой смысл расширять рамки, если нет документации, как ее расширить?!?
[EDIT # 3]
Как указано в моем комментарии ниже ... У меня TransportWithMessageCredential работает просто отлично, используя UserNameSecurityToken. К сожалению, мои услуги в конечном итоге потребуют пользовательских токенов, когда придет время реализовать некоторые дополнительные функции, которые я запланировал.
Что я ищу в ответ будет:
Как поддерживать учетные данные пользовательских услуг и маркеры с поддержкой WSDL?
В настоящее время, следуя примерам Microsoft, вы можете использовать собственные учетные данные только с помощью ChannelFactory и создания пользовательской привязки на клиенте. Я бы предпочел не заниматься этим.
Если этот вопрос останется без ответа, я буду продолжать повышать щедрость. Как только я смогу получить все это, я напишу учебник для блога о всех шагах, необходимых для создания специального решения безопасности.
Ну, я на правильном пути, но это очень недокументированная область в WCF, которую я нахожу удивительной. Вы можете следить за упомянутыми выше статьями MSDN, но MS также предоставляет файлы решений, которые можно использовать вместе с ними: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=35ec8682-d5fd-4bc3-a51a -d8ad115a8792 & displaylang = en – Daniel
Я пришел к выводу, что возврат инвестиций в создание пользовательских учетных данных и токенов просто не стоит того времени, которое я вкладываю в это. Надеюсь, в будущем MS придет с некоторой лучшей поддержкой в этой области. Я решил сделать то, что могу, с типом учетных данных для имени пользователя. Я оставлю этот вопрос открытым для ответа и вознагражу награду, если кто-то все равно сможет ее решить. – Daniel
UserNameSecurityToken работает только сейчас, хотя в конечном итоге мне потребуются пользовательские токены, когда пришло время реализовать еще несколько расширенных функций, которые я запланировал. То, что я ищу в качестве ответа, будет «Как поддерживать собственные учетные данные и токены службы с поддержкой WSDL». Если этот вопрос останется без ответа, я продолжу щедрость. – Daniel