4

これで、現在.NET3.5で実行されているレガシーASMXWebサービスがあり、VisualStudio2008を使用しています。

問題は、認証を追加する必要があり、現在認証する必要のない既存の内部クライアントを壊すことなく、WS-Securityモデルを利用したいということです。

カスタムヘッダーを追加することを検討しましたが、それはWS-Security風ではありません。また、WCFへのアップグレードは、長期的な目標ではありますが、短期的には実行可能ではありません。

VS2008 ASMX Webサービスのsoapヘッダーで間接的にUsernameTokenにアクセスする方法はありますか(クライアントから渡された場合)?

4

1 に答える 1

7

Webサービス拡張機能(WSE)3.0を試すことができます。これにより、古いバージョンのWS-Security(2004バージョン-WCFは2005および2007バージョンをサポートすると思います)のサポートが追加されます。ASMXの上に邪魔されることなく配置され、.NET 3.5/WS2008でも機能します。

欠点については、次のとおりです。

  • VS2008は、クライアントコードでのWSE対応のWeb参照の追加または更新をサポートしていません。通常のASMXプロキシクラスは問題なく作成されますが、認証に必要な追加のWSEプロキシクラスは作成されません。既存のWSEプロキシコードはすべて正常にコンパイルされますが、IDEでWeb参照を更新しようとすると削除されます。VS2005のコピーを所有している場合は、それを使用して、クライアント側でWeb参照を維持または少なくとも作成できます。
  • AFAIK、WS-SecurityのWSE実装は、WCF実装と100%上位互換性がありません。確認するために、WCFを使用して独自の互換性テストを行う必要があります。

クライアントでの資格情報の指定:

void SetUsernameCredential(WebServicesClientProtocol service, string userName, string password) {
    UsernameToken token = new UsernameToken(userName, password, PasswordOption.SendHashed);
    service.SetClientCredential(token);
}

サーバーでの資格情報の認証:

public class MyUsernameTokenManager : UsernameTokenManager {
    protected override string AuthenticateToken(UsernameToken token) {
        // Authenticate here.
        // If succeess, return an authenticated IPrincipal and the user's password as shown.
        // If failure, throw an exception of your choosing.
        token.Principal = principal;
        return password;
    }
}

サーバーでの資格情報の読み取り:

IPrincipal principal = RequestSoapContext.Current.IdentityToken.Principal;
于 2009-12-08T16:59:23.537 に答える