Служба WCF не прошла аутентификацию на сервере 2012, но в Win7 все в порядке?

Я создал службу WCF с аутентификацией и авторизацией на основе ролей. И реализация каждой операции похожа на

[PrincipalPermission(SecurityAction.Demand, Role = RoleConstants.Customer)]
[PrincipalPermission(SecurityAction.Demand, Role = RoleConstants.CustomerStaff)]
public void DoSomething()
{
}

Провайдер членства и RoleManager - это те, которые используются для MySql, а не для GAC. Сертификаты SSL генерируются IIS 7 для https.

И у меня есть несколько интеграционных тестов, например

using (var client = new MyProxy("DefaultBinding_ILicensingService"))
{
    client.ClientCredentials.UserName.UserName = "AbcShop";
    client.ClientCredentials.UserName.Password = "tttttttt";

    client.DoSomething();
}

Один экземпляр работает на моей машине разработки Win7, а другой - на тестовом сервере Server 2012. Оба экземпляра службы WCF работали хорошо.

Однако через 1 месяц я обнаружил, что экземпляр на Server 2012 больше не работает и не прошел аутентификацию со следующим сообщением.

Обновление:

System.ServiceModel.Security.MessageSecurityException : An unsecured or incorrectly secured fault was received from the other party. See the inner FaultException for the fault code and detail.
---- System.ServiceModel.FaultException : An error occurred when verifying security for the message.
Stack Trace:

Server stack trace: 
   at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.ProcessReply(Message reply, SecurityProtocolCorrelationState correlationState, TimeSpan timeout)
   at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)

Обновление:

Я заметил следующее и исключил возможные причины.

  1. Базы данных аутентификации на обеих машинах идентичны, и я мог видеть, что служба WCF выполняет SQL-запросы для получения информации о членах после того, как клиент делает запрос.
  2. Я сравнил привязку и настройки IIS, а также файл web.config на обоих машинах, которые в основном идентичны, за исключением некоторых адресов.
  3. Средство просмотра событий не отображает предупреждений о службе WCF.
  4. Реализация службы WCF украшена этим атрибутом: открытый класс ErrorHandlerBehaviorAttribute: Attribute, IServiceBehavior, IErrorHandler, и все неперехваченные исключения будут передаваться в этот атрибут, который будет записывать ошибки в файл журнала, однако файл журнала ничего не записал по этому поводу.

И я сравнил загруженные сборки в обоих случаях. В Windows 7 системные сборки в основном находятся из Windows \ Microsoft.NET \ assembly \ GACXXX \ XXX, однако в Server 2012 некоторые сборки находятся из Windows \ assembly \ NativeImages_v4.0.30319_64, вот некоторые сборки, расположенные в NativeImages:

System   
System.Activities   
System.Core   
System.Data.DataSetExtensions   
System.Drawing   
System.Enumerics
System.ServiceModel.Activities   
System.WorkflowServices   
System.XAML   
System.ServiceModel.Web

Напротив, в Win 7 только System из NativeImages. Я не уверен, может ли расположение сборок или собственных образов изменить поведение.

Услуги и клиенты разрабатываются с использованием VS 2012 на платформе .NET Framework 4.5.

Что еще могло привести к сбою экземпляра на Server 2012?


person ZZZ    schedule 11.04.2014    source источник
comment
Не могли бы вы добавить web.config? При доступе к WSDL сервиса из браузера он работает или нет?   -  person pepo    schedule 11.04.2014
comment
Да, конечно, публикация wsdl в порядке. И запрос дошел до службы, и я мог заметить, что служба обращается к базе данных аутентификации и извлекает информацию о членах по запросу клиента для операции.   -  person ZZZ    schedule 11.04.2014


Ответы (1)


Проблемы решены.

Основная причина: отсутствие сборок ASP .NET MVC в Server 2012.

Предыстория заключается в том, что я хочу, чтобы служба WCF использовала одну и ту же базу данных аутентификации с приложениями MVC, которые будут созданы в будущем. Таким образом, поставщик участников и диспетчер аутентификации - это те, которые принадлежат MVC, а база данных - MySql, поэтому поставщики принадлежат стороннему компоненту с открытым исходным кодом, который связан с MVC.

Причины, по которым мой обработчик неперехваченных исключений и средство просмотра событий не могли поймать предупреждения об отсутствующих сборках: 1. ПК разработчика использовался предыдущим разработчиком, которому нравился GAC. Вы знаете, что GAC может вызвать много проблем на компьютере разработчика. Тонны сборки из MVC 1,2, и 3 были в GAC. 2. Третий компонент, взаимодействующий с MVC, имеет некоторую плохую практику программирования, где-то проглатывая некоторые исключения о недостающих сборках.

После того, как я сравнил загруженные сборки одну за другой на обеих машинах, я обнаружил, что экземпляр службы WCF на сервере 2012 не имеет WebMatrix.WebData.dll. После того, как я скопировал сборку в каталог bin виртуального каталога, я получил цепочку сообщений об ошибках о других недостающих сборках после того, как я скопировал недостающие сборки, о которых сообщалось одна за другой. Эти сборки в основном принадлежат MVC. Сообщения об ошибках появлялись на стороне клиента в ответе службы в HTML, а также в средстве просмотра событий на стороне сервера.

Итак, теперь я гарантирую, что сценарии развертывания включают соответствующие сборки.

По-видимому, после того, как служба извлекла информацию о члене из базы данных аутентификации, служба делегирует эту информацию другим сборкам MVC для дальнейшей обработки, и каким-то образом 3-й компонент проглотил исключение об отсутствующих сборках. И другие части аутентификации получили неправильный сигнал, а затем выдали вводящее в заблуждение предупреждающее сообщение о «Проверка безопасности ...».

Урок такой: 1. Не используйте GAC в dev-машине. Если вы унаследовали от кого-то машину разработчика, лучше потратить время на то, чтобы отключить некоторые из них, которые должны были быть частными сборками через XCopy. 2. Некоторые сторонние компоненты могут иметь грязную практику против защитного программирования. В моем случае компонент проглотил предупреждения об отсутствующих сборках. 3. Дешевле сравнивать загруженные сборки, прежде чем исследовать другие возможные причины. Я использую Process Explorer для вывода списка загруженных сборок в w3wp.exe.

person ZZZ    schedule 11.04.2014
comment
Да, GAC мерзкий :). Хороший анализ. +1 - person pepo; 11.04.2014