代码之家  ›  专栏  ›  技术社区  ›  James Michael Hare

如何使用WS-Security并从ASMX Web服务访问UsernameToken?

  •  4
  • James Michael Hare  · 技术社区  · 15 年前

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

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

    是否有一种方法可以间接访问VS2008 ASMX web服务的soap头中的UsernameToken(前提是由客户端传递)?

    1 回复  |  直到 14 年前
        1
  •  7
  •   Christian Hayter    15 年前

    你可以试试 Web Services Enhancements (WSE) 3.0 . 这增加了对 古老的

    现在谈谈不利因素:

    • 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;