自定义X509SecurityTokenManager被忽略

时间:2020-03-05 18:58:20  来源:igfitidea点击:

我有一个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>

添加这些行后,我得到了预期的错误。