WSE3.0のX.509証明書でメッセージレイヤーセキュリティを使用するWebサービスがあります。このサービスは、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>`
(ところで、ここスタックオーバーフローで1つのフォーマット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);
私は当分の間.NET2.0(VS2005)で立ち往生しているので、WCFは問題外だと思います。そうでなければ、システム内のクライアントとサービスの両方を制御できるため、相互運用性は問題になりません。