我已经创建了一个具有角色基础认证和授权的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)
更新:
我观察到以下内容,排除了一些可能的原因。
- 两台机器上的auth数据库都是相同的,我可以看到WCF服务正在进行SQL查询以在客户端发出请求后检索成员信息。
- 我已经比较了IIS绑定和设置,以及两台机器上的web.config,除了某些地址外,它们基本相同。
- 事件查看器显示没有关于WCF服务的警告。
- 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上的实例失败?
请问您可以添加一个web.config吗?当你从浏览器访问服务的WSDL时,它是否工作? – pepo
是的,当然wsdl发布是可以的。并且请求到达了服务,我可以观察到服务正在与auth数据库交谈,并在客户端请求操作时检索成员信息。 – ZZZ