Я создал службу 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)
Обновление:
Я заметил следующее и исключил возможные причины.
- Базы данных аутентификации на обеих машинах идентичны, и я мог видеть, что служба WCF выполняет SQL-запросы для получения информации о членах после того, как клиент делает запрос.
- Я сравнил привязку и настройки IIS, а также файл web.config на обоих машинах, которые в основном идентичны, за исключением некоторых адресов.
- Средство просмотра событий не отображает предупреждений о службе WCF.
- Реализация службы 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?