我创建了一个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的Dev Machine上运行,另一个实例在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. 这两台机器上的Auth数据库是相同的,我可以看到WCF服务正在制作SQL查询,以便在客户端进行请求后检索成员信息。
  2. 我已经将IIS绑定和设置进行了比较,以及两台机器上的Web.config,除了一些地址之外基本相同。
  3. 事件查看器显示WCF服务没有警告。
  4. WCF服务实现由此属于此属性:公共类ErrorHandlerBehAviorAttribute:属性,IserviceBehavior,IErrorHandler和所有未捕获的异常将转到此属性,该属性将将错误记录到日志文件中,但是,日志文件无关这件事。
  5. 并且我在两个实例中比较了加载的装配。在Windows 7中,系统程序集基本上来自Windows \ Microsoft.NET \ assembly \ gacxxx \ xxx,但在Server 2012中,一些程序集来自Windows \ assemast \ 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
    
    . 相比之下,在Win 7中,只有系统来自您来自本地性。我不确定组装或本机图像的位置是否可以改变行为。

    服务和客户端是在.NET Framework 4.5上使用VS 2012开发的。

    还有什么可能使服务器2012的实例失败?

有帮助吗?

解决方案

问题已解决。

原因的根源:在服务器2012中缺少ASP .NET MVC程序集。

背景是,我希望WCF服务与将来建造的MVC应用程序共享相同的Auth数据库。因此,成员提供者和Auth Manager是来自MVC的成员提供者,数据库是MySQL,因此提供程序来自开源第3方组件,耦合与MVC。

我未捕获的异常处理程序和事件查看器无法捕获关于丢失的装配的警告的原因是: 1. DEV PC由喜爱GAC的先前开发人员使用。您知道GAC可能会导致DEV PC中的很多问题。来自MVC 1,2和3的大量组装在GAC中。 2.与MVC交互的第三个组件在某处吞下了一些差的编程实践,吞下了一些关于丢失的装配的一些例外。

在两台机器中逐个比较加载的装配组件后,我发现服务器2012上的WCF服务实例没有WebMatrix.WebData.dll。在我将装配复制到虚拟目录的BIN目录之后,我在被复制的丢失的装配逐个报告后,我收到了一个关于更多丢失程序集的错误消息。这些程序集基本属于MVC。在HTML中的服务中的响应中出现错误消息,以及服务器端中的事件查看器。

所以我现在确保部署脚本包括相应的组件。

显然在服务中检索到的成员信息从Auth数据库中,该服务将委派信息委派给MVC的其他程序集以进行进一步处理,并且某种方式吞下了关于丢失组件的例外。身份验证的其他部分出现了错误的信号,然后给出了关于“验证安全性...”的误导性警告消息。

课程是: 1.不要在DEV机器中进行GAC。如果您继承了来自某人的Dev机器,最好更好地投资于un-gac的某些情况,其中一些应该是通过xcopy私有装配。 2.一些第三方组成部分可能会对防御性规划进行一些肮脏的做法。在我的情况下,该组件吞噬了关于缺失装配的警告。 在调查其他可能的原因之前,比较装载的组件更便宜。我使用process资源管理器列出w3wp.exe中的加载程序集。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top