2010-11-11 3 views
5

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

  1. Создать маркер (MSDN)
  2. пользовательские службы Продлить WCF путем создания пользовательских SecurityTokenProvider, SecurityTokenAuthenticator и SecurityTokenSerializer (MSDN)
  3. Продлить 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 и создания пользовательской привязки на клиенте. Я бы предпочел не заниматься этим.

Если этот вопрос останется без ответа, я буду продолжать повышать щедрость. Как только я смогу получить все это, я напишу учебник для блога о всех шагах, необходимых для создания специального решения безопасности.

+0

Ну, я на правильном пути, но это очень недокументированная область в WCF, которую я нахожу удивительной. Вы можете следить за упомянутыми выше статьями MSDN, но MS также предоставляет файлы решений, которые можно использовать вместе с ними: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=35ec8682-d5fd-4bc3-a51a -d8ad115a8792 & displaylang = en – Daniel

+0

Я пришел к выводу, что возврат инвестиций в создание пользовательских учетных данных и токенов просто не стоит того времени, которое я вкладываю в это. Надеюсь, в будущем MS придет с некоторой лучшей поддержкой в ​​этой области. Я решил сделать то, что могу, с типом учетных данных для имени пользователя. Я оставлю этот вопрос открытым для ответа и вознагражу награду, если кто-то все равно сможет ее решить. – Daniel

+0

UserNameSecurityToken работает только сейчас, хотя в конечном итоге мне потребуются пользовательские токены, когда пришло время реализовать еще несколько расширенных функций, которые я запланировал. То, что я ищу в качестве ответа, будет «Как поддерживать собственные учетные данные и токены службы с поддержкой WSDL». Если этот вопрос останется без ответа, я продолжу щедрость. – Daniel

ответ

5

Я бы посоветовал вам взглянуть на Windows Identity Foundation и двигаться в направлении защиты/федерации на основе требований. Эта модель поддерживает пользовательские учетные данные намного лучше, поскольку они представляют собой просто другой набор требований.

+0

Я изучал WIF и прочитал книгу Витторио Берточчи по этому вопросу. Тем не менее, я не уверен, что здесь нужен мой собственный STS IdP. Определенно, это будет вариант. Большое спасибо за ваш вклад. – Daniel

Смежные вопросы