У меня есть веб-сервис, который использует безопасность уровня сообщений с сертификатами X.509 в WSE 3.0. Служба использует политику X509v3 для подписи различных элементов в soapheader.
Мне нужно выполнить некоторые пользовательские проверки сертификатов, поэтому я попытался реализовать пользовательский X509SecurityTokenManager и добавил раздел в web.config.
Когда я вызываю службу с помощью моего Wseproxy, я ожидаю ошибку (NotImplementedException), но вызов проходит через него, и в приведенном ниже примере на консоли выводится «foo».
Вопрос: что пропустили? Тип binarySecurityTokenManager в web.config соответствует полному имени класса 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>`
(Кстати, как же один формат XML хорошо здесь, в stackoverflow?)
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 не может быть и речи, в противном случае совместимость не является проблемой, поскольку я буду контролировать как клиентов, так и службы в системе.