4

好的,所以我们有一个旧版 ASMX Web 服务,目前在 .NET 3.5 中运行,并且我们使用的是 Visual Studio 2008。

问题是,我们需要添加身份验证并希望利用 WS-Security 模型而不破坏任何当前不需要进行身份验证的现有内部客户端。

我们考虑过添加自定义标头,但这不是很符合 WS-Security-ish。此外,升级到 WCF 虽然是一个长期目标,但在短期内是不可行的。

有没有办法在 VS2008 ASMX Web 服务的soap 标头中间接访问 UsernameToken(假设它是由客户端传递的)?

4

1 回答 1

7

您可以尝试Web Services Enhancements (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 回答