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 с пользовательскими учетными данными, я должен:

  1. Создать пользовательский сервисный токен ( MSDN)
  2. Расширьте WCF, создав пользовательский SecurityTokenProvider, SecurityTokenAuthenticator и SecurityTokenSerializer ( MSDN).
  3. Расширьте 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 и двигаться в направлении безопасности / федерации на основе утверждений. Эта модель намного лучше поддерживает пользовательские учетные данные, поскольку они представляют собой просто другой набор утверждений.

Другие вопросы по тегам