WS-Security を使用し、ASMX Web サービスから UsernameToken にアクセスするにはどうすればよいですか?
-
18-09-2019 - |
質問
さて、現在 .NET 3.5 で実行されているレガシー ASMX Web サービスがあり、Visual Studio 2008 を使用しています。
問題は、認証を追加する必要があり、現在認証する必要のない既存の内部クライアントを壊すことなく WS-Security モデルを利用したいということです。
カスタム ヘッダーを追加することも考えましたが、それはあまり WS-Security らしくありません。また、WCF へのアップグレードは長期的な目標ではありますが、短期的には実現可能ではありません。
VS2008 ASMX Web サービスの SOAP ヘッダーで間接的に UsernameToken (クライアントによって渡される場合) にアクセスする方法はありますか?
解決
試してみてもいいでしょう Web サービス拡張機能 (WSE) 3.0. 。これにより、 古い WS-Security のバージョン (2004 バージョンだと思います。WCF は 2005 および 2007 バージョンをサポートしています)。ASMX を妨げることなく ASMX 上に配置され、.NET 3.5 / WS2008 でも動作します。
次に欠点について説明します。
- VS2008 は、クライアント コードでの WSE 対応 Web 参照の追加または更新をサポートしていません。通常の ASMX プロキシ クラスは問題なく作成されますが、認証に必要な追加の WSE プロキシ クラスは作成されません。既存の WSE プロキシ コードはコンパイルに問題ありませんが、IDE で Web 参照を更新しようとすると削除されます。VS2005 のコピーを所有している場合は、それを使用してクライアント側で Web 参照を維持または作成できます。
- 私の知る限り、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;
所属していません StackOverflow