Pergunta

Eu havia criado um serviço WCF com função de base de autenticação e autorização.E a execução de cada operação, é como

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

O provedor de associação e RoleManager são aqueles para o MySql, não no GAC.Os certificados SSL são gerados pelo IIS 7 para https.

E eu tenho alguns testes de integração, como

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

    client.DoSomething();
}

Uma instância está em execução no meu dev máquina do Win7, e o outro é em um servidor de teste do Servidor de 2012.Ambas as instâncias do serviço WCF tinha trabalhado bem.

No entanto, após 1 meses, descobri que a instância no Servidor de 2012 não está funcionando mais, e falha na autenticação, com a seguinte mensagem.

Atualização:

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)

Atualização:

Tenho observado o seguinte e descartou a possibilidade de algumas causas possíveis.

  1. O auth bancos de dados em ambos os computadores forem idênticos, e eu podia ver o serviço WCF está fazendo consultas SQL para recuperar informações de um membro após o cliente faz um pedido.
  2. Eu tinha comparado a vinculação do IIS e definições, assim como a web.configuração em ambas as máquinas, que são basicamente idênticos, com exceção de alguns endereços.
  3. O Visualizador de Eventos mostra nenhum aviso sobre o serviço do WCF.
  4. O serviço do WCF implementação é decorado por isso atribuído:classe pública ErrorHandlerBehaviorAttribute :Atributo, IServiceBehavior, IErrorHandler, e todas as exceções não apanhadas irá para este atributo, que vai de log de erros em um arquivo de log, no entanto, o arquivo de log gravado nada para esta questão.

E eu tinha comparado o carregado assembléias em ambos os casos.No Windows 7, o sistema de montagens são, basicamente, a partir de Windows\Microsoft.NET\assembly\GACXXX\XXX, no entanto, em Servidor de 2012, alguns conjuntos são a partir de Windows\assembly ativeImages_v4.0.30319_64,aqui estão alguns conjuntos localizados em NativeImages:

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

Em contraste, no Win 7, apenas o Sistema é de NativeImages.Eu não tenho certeza se o local de montagem ou de imagens nativas que poderia alterar os comportamentos.

Os serviços e os clientes são desenvolvidos usando o VS 2012 em .NET Framework 4.5.

O que mais poderia fazer a instância no Servidor de 2012 falhar?

Foi útil?

Solução

Problemas resolvidos.

A raiz da causa:falta ASP .NET MVC assembleias Server 2012.

O fundo é, eu quero o serviço WCF para compartilhar o mesmo autenticação de banco de dados com aplicações MVC para ser construída no futuro.Assim, o membro do provedor e a autenticação do gestor são as da CVM e o banco de dados é o MySql, então, os fornecedores são de uma fonte aberta de 3ª parte componente que é, juntamente com o MVC.

As razões por que o meu uncaught exception handler e o Visualizador de Eventos não pôde pegar avisos sobre a falta de assembléias são:1.O dev PC foi usada por um antes de desenvolvedor que amava GAC.Você sabe o GAC pode causar uma série de problemas em um dev PC.Toneladas de montagem do MVC 1,2,e 3 foram no GAC.2.A 3ª componente de interação com o MVC tem alguns má prática de programação em algum lugar engolir algumas exceções sobre a falta de assemblies.

Depois que eu comparada carregado assembléias, uma por uma máquina, achei o serviço do WCF instância no Servidor de 2012 não tinha WebMatrix.WebData.dll.Depois copiei o assembly no diretório bin do diretório virtual, eu tenho uma cadeia de mensagens de erro sobre mais falta assembleias depois que eu copiado falta assembléias relatadas uma por uma.Esses assemblies basicamente pertencem a MVC.As mensagens de erro apareceu no lado do cliente na resposta do serviço em HTML, assim como o Visualizador de Eventos no lado do servidor.

Então eu agora assegurar a implementação de scripts para incluir respectivas assembleias.

Aparentemente, depois que o serviço for recuperado membro de informações de autenticação de banco de dados, o serviço irá delegar as informações para outros conjuntos de MVC para o processamento, e, de alguma forma, a 3ª componente de ingestão de exceção sobre a falta de assemblies.E as outras partes da autenticação tem um sinal errado e, em seguida, deu enganosa mensagem de aviso sobre "Verificação de Segurança...".

A lição é:1.Não GAC dev máquina.Se você herdou um dev máquina de alguém, melhor investir em algum momento da onu-gac alguns que se tinham sido conjuntos particulares através de XCopy.2.Alguns componentes de terceiros 3 pode ter alguns sujo prática contra defensiva de programação.No meu caso, o componente engoliu os avisos sobre a falta de assemblies.3.É mais barato para comparar carregado assembléias antes de investigar outras possíveis causas.Eu uso o Process Explorer para lista de assemblies carregados no w3wp.exe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top