문제

역할 기본 인증 및 권한이있는 WCF 서비스를 만들었습니다. 각 작업의 구현은

와 같습니다.
[PrincipalPermission(SecurityAction.Demand, Role = RoleConstants.Customer)]
[PrincipalPermission(SecurityAction.Demand, Role = RoleConstants.CustomerStaff)]
public void DoSomething()
{
}
.

회원 공급자와 rolemanager는 GAC가 아닌 MySQL의 것입니다. SSL 인증서는 HTTPS 용 IIS 7에서 생성됩니다.

와 나는

와 같은 통합 테스트가 있습니다.
using (var client = new MyProxy("DefaultBinding_ILicensingService"))
{
    client.ClientCredentials.UserName.UserName = "AbcShop";
    client.ClientCredentials.UserName.Password = "tttttttt";

    client.DoSomething();
}
.

하나의 인스턴스가 Win7의 My Dev 시스템에서 실행되고 다른 하나는 Server 2012의 테스트 서버에 있습니다. WCF 서비스의 두 인스턴스가 잘 작동했습니다.

그러나 1 개월 후에 서버 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. 두 시스템의 인증 데이터베이스는 동일합니다. 클라이언트가 요청을 수행 한 후에는 SQL 서비스가 회원 정보를 검색하도록 SQL 쿼리를 만드는 것을 볼 수 있습니다.
  2. IIS 바인딩 및 설정뿐만 아니라 두 시스템 모두에서 Web.config를 비교했으며 일부 주소를 제외하고 기본적으로 동일합니다.
  3. 이벤트 뷰어는 WCF 서비스에 대한 경고가 표시되지 않습니다.
  4. WCF 서비스 구현은이 속성으로 장식됩니다. Public 클래스 오류 핸인트 : Attribute, IserviceBehavior, IErrorHandler 및 모든 잡히지 않은 예외는 로그 파일에 오류를 기록하는이 속성으로 이동하지만 로그 파일은 아무 것도 기록되지 않습니다. 이 문제.
  5. 두 인스턴스에서로드 된 어셈블리를 비교했습니다. Windows 7에서는 시스템 어셈블리가 기본적으로 Windows \ Microsoft.Net \ xxx \ gacxxx \ xxx이지만 일부 어셈블리는 Windows \ Assembly \ NativeImages_v4.0.30319_64의 일부 어셈블리가 여기에있는 일부 어셈블리가 있습니다.

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

    대조적으로 7에서 시스템 만 intelyImages에서만 있습니다. 어셈블리 또는 기본 이미지의 위치가 동작을 변경할 수 있는지 확실하지 않습니다.

    서비스 및 클라이언트는 .NET Framework 4.5에서 VS 2012를 사용하여 개발되었습니다.

    서버 2012에서 인스턴스가 실패 할 수있는 또 다른 방법은 무엇입니까?

도움이 되었습니까?

해결책

문제가 해결되었습니다.

원인의 루트 : Server 2012에서 ASP .NET MVC 어셈블리가 누락되었습니다.

배경은 WCF 서비스가 MVC 응용 프로그램을 사용하여 MVC 응용 프로그램을 사용하여 MVC 응용 프로그램을 공유하고 싶습니다. 따라서 회원 공급자와 인증 관리자는 MVC의 사용자이며 데이터베이스는 MySQL이므로 공급자는 MVC와 함께 결합 된 오픈 소스 타사 구성 요소의 것입니다.

INFACKANT 예외 처리기와 이벤트 뷰어가 누락 된 어셈블리에 대한 경고를 잡을 수없는 이유는 다음과 같습니다. 1. DEV PC는 GAC를 좋아하는 이전 개발자가 사용했습니다. GAC가 DEV PC에서 많은 문제를 일으킬 수 있습니다. MVC 1,2 및 3의 조립의 톤은 GAC에 있었다. 2. MVC와 상호 작용하는 3 번째 구성 요소는 누락 된 어셈블리에 대한 일부 예외를 삼키는 일부 프로그래밍 연습이 있습니다.

두 컴퓨터에서 하나씩로드 된 어셈블리를 하나씩 비교 한 후 서버 2012의 WCF 서비스 인스턴스가 webmatrix.webdata.dll이 없었습니다. 가상 디렉터리의 빈 디렉토리에 어셈블리를 복사 한 후에 누락 된 어셈블리를 복사 한 후에 더 누락 된 어셈블리에 대한 오류 메시지 체인이 있습니다. 이러한 어셈블리는 기본적으로 MVC에 속합니다. HTML의 서비스의 응답에서 클라이언트 측에 오류 메시지가 나타납니다. 서버 측의 이벤트 뷰어뿐만 아니라

이제 각 어셈블리를 포함하도록 배포 스크립트를 보장합니다.

Service가 인증 데이터베이스에서 회원 정보를 검색 한 후에 서비스는 추가 처리를 위해 MVC의 다른 어셈블리에 대한 정보를 위임하며, 어떻게 든 3 번째 구성 요소는 누락 된 어셈블리에 대한 예외를 제시했습니다. 그리고 인증의 다른 부분은 잘못된 신호를 얻은 다음 "보안 확인 ..."에 대한 오해의 소지가있는 경고 메시지를 줬습니다.

수업은 다음과 같습니다. 1. dev 기계에서 gac하지 마십시오. 당신이 누군가로부터 dev 기계를 상속 한 경우, 언젠가는 언젠가는 Xcopy를 통해 개인 어셈블리가되어야 했어야 할 un-gac에 투자하는 것이 좋습니다. 2. 일부 제 3 자의 구성 요소는 방어 프로그래밍에 대한 더러운 연습을 가질 수 있습니다. 내 경우, 구성 요소는 누락 된 어셈블리에 대한 경고를 삼켰습니다. 3. 다른 가능한 원인을 조사하기 전에로드 된 어셈블리를 비교하는 것이 더 쌉니다. 프로세스 탐색기를 사용하여 w3wp.exe에서로드 된 어셈블리를 나열합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top