自定义X509SecurityTokenManager被忽略
我有一个Web服务,该服务在WSE 3.0中使用带有X.509证书的消息层安全性。该服务使用X509v3策略对soapheader中的各种元素进行签名。
我需要对证书进行一些自定义检查,因此我尝试实现自定义X509SecurityTokenManager并在web.config中添加了一个部分。
当我用Wseproxy调用该服务时,我会期望出现一个错误(NotImplementedException),但是该调用会失败,并且在下面的示例中,控制台上会显示" foo"。
问题是:错过了什么? web.config中的binarySecurityTokenManager类型与RDI.Server.X509TokenManager的完整类名匹配。 X509TokenManager继承自
X509SecurityTokenManager(所有方法只是存根)。
using System; using System.Xml; using System.Security.Permissions; using System.Security.Cryptography; using Microsoft.Web.Services3; using Microsoft.Web.Services3.Security.Tokens; namespace RDI.Server { [SecurityPermissionAttribute(SecurityAction.Demand,Flags = SecurityPermissionFlag.UnmanagedCode)] public class X509TokenManager : Microsoft.Web.Services3.Security.Tokens.X509SecurityTokenManager { public X509TokenManager() : base() { throw new NotImplementedException("Stub"); } public X509TokenManager(XmlNodeList configData) : base(configData) { throw new NotImplementedException("Stub"); } protected override void AuthenticateToken(X509SecurityToken token) { base.AuthenticateToken(token); throw new NotImplementedException("Stub"); } } }
为简洁起见,对我的web.config的前几行进行了编辑
<?xml version="1.0"?> <configuration><configSections><section name="microsoft.web.services3" type="..." /> </configSections> <microsoft.web.services3> <policy fileName="wse3policyCache.config" /> <security> <binarySecurityTokenManager> <add type="RDI.Server.X509TokenManager" valueType="http://docs.oasis-open.org/..." /> </binarySecurityTokenManager> </security> </microsoft.web.services3>`
(顺便说一句,如何在stackoverflow上很好地格式化xml?)
Administration.AdministrationWse test = new TestConnector.Administration.AdministrationWse(); X509Certificate2 cert = GetCert("RDIDemoUser2"); X509SecurityToken x509Token = new X509SecurityToken(cert); test.SetPolicy("X509"); test.SetClientCredential(x509Token); string message = test.Ping("foo"); Console.WriteLine(message);
我暂时停留在.NET 2.0(VS2005)上,因此我认为WCF毫无疑问,否则互操作性就不是问题,因为我可以控制系统中的客户端和服务。
解决方案
回答
我知道这不是特别有建设性的建议,但是如果我是我们,我会尽快退出WSE3.0。今年年初,我们做了一些工作,试图使其与WCF和Java客户端进行互操作,这绝对是一个重要的KNIGHTMARE。
另一方面,WCF实际上是理智的,并且关于此类区域的文档非常好。这是选择吗?
回答
问题出在其他地方。我的serverproject是一个Web应用程序,某些选项不适用于仅适用于网站的Web应用程序。因此,我做了一个小型网站项目,比较了web.configs,发现有些地方有所不同。
这些行在网站web.config中,但不在我的其他项目中
<soapServerProtocolFactory type="Microsoft.Web.Services3.WseProtocolFactory, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> <soapExtensionImporterTypes> <add type="Microsoft.Web.Services3.Description.WseExtensionImporter, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </soapExtensionImporterTypes>
添加这些行后,我得到了预期的错误。