У меня есть веб-сервис, который использует безопасность на уровне сообщений с сертификатами X.509 в WSE 3.0. Служба использует политику X509v3 для подписи различных элементов в заголовке мыла.
Мне нужно выполнить несколько пользовательских проверок сертификатов, поэтому я попытался реализовать собственный 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 не может быть и речи, иначе совместимость не проблема, так как я буду контролировать как клиентов, так и службы в системе.





Я не знаю конкретных конструктивных советов, но на вашем месте я бы отказался от WSE3.0 как можно скорее. Мы проделали некоторую работу, пытаясь заставить его взаимодействовать с WCF и клиентом Java в начале этого года, и это был абсолютный KNIGHTMARE.
WCF, с другой стороны, практически нормален, и документация по таким областям довольно хороша. Это вариант для вас?
Проблема была в другом месте. Мой серверный проект был веб-приложением, и некоторые параметры не были доступны для веб-приложений только для веб-сайтов. Итак, я сделал небольшой проект веб-сайта, сравнил 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>
После того, как я добавил эти строки, я получил ожидаемую ошибку.