2014-04-11 23 views
1

我已经创建了一个具有角色基础认证和授权的WCF服务。而每个操作的执行就像WCF服务在Server 2012上的身份验证失败,但在Win7中正常?

[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. 两台机器上的auth数据库都是相同的,我可以看到WCF服务正在进行SQL查询以在客户端发出请求后检索成员信息。
  2. 我已经比较了IIS绑定和设置,以及两台机器上的web.config,除了某些地址外,它们基本相同。
  3. 事件查看器显示没有关于WCF服务的警告。
  4. WCF服务实现由此属性修饰:public class 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中,只有系统来自NativeImages。我不确定程序集或本地图像的位置是否会改变行为。

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

还有什么可能使Server 2012上的实例失败?

+0

请问您可以添加一个web.config吗?当你从浏览器访问服务的WSDL时,它是否工作? – pepo

+0

是的,当然wsdl发布是可以的。并且请求到达了服务,我可以观察到服务正在与auth数据库交谈,并在客户端请求操作时检索成员信息。 – ZZZ

回答

2

已解决的问题。

原因的根源:缺少ASP .NET MVC组件在Server 2012中

的背景是,我想WCF服务共享与MVC应用程序相同的身份验证数据库中内置的未来。所以成员提供者和认证管理器是MVC中的,而数据库是MySql,所以提供者来自与MVC相耦合的开源第三方组件。

为什么我的未捕获的异常处理程序和事件查看器无法捕获有关丢失程序集的警告的原因如下: 1.开发人员使用开发人员喜爱GAC。您知道GAC可能在开发PC中导致很多问题。 MVC 1,2和3的装配量在GAC中。 2.与MVC交互的第三个组件有一些糟糕的编程习惯,吞噬了一些关于缺少组件的例外。

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

所以我现在确保部署脚本包含各自的程序集。

显然,服务从auth数据库检索到成员信息后,服务会将信息委托给其他MVC组件以供进一步处理,并且第三个组件吞食了有关缺少组件的异常。并且认证的其他部分得到了错误的信号,然后给出了关于“验证安全性...”的误导性警告消息。

教训是: 1.请勿在开发机器上安装GAC。如果你从某人那里继承了一台开发机器,那么最好是花些时间去开发一些本应该通过XCopy进行私人装配的机器。 2.某些第三方组件可能对防御性编程有些肮脏的做法。就我而言,该组件吞噬了有关缺少组件的警告。 3.在调查其他可能的原因之前,比较装载的组件比较便宜。我使用Process Explorer在w3wp.exe中列出加载的程序集。

+0

是的,GAC很讨厌:)。良好的分析。 +1 – pepo