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