如何使用ASMX Web服务中的WS-Security和Access UsernameToken?

Jam*_*are 4 c# ws-security web-services asmx usernametoken

好的,我们有一个目前在.NET 3.5中运行的传统ASMX Web服务,我们正在使用Visual Studio 2008.

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

我们已经考虑过添加自定义标头,但这不是WS-Security-ish.升级到WCF虽然是长期目标,但短期内不可行.

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

Chr*_*ter 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);
}
Run Code Online (Sandbox Code Playgroud)

验证服务器上的凭据:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

读取服务器上的凭据:

IPrincipal principal = RequestSoapContext.Current.IdentityToken.Principal;
Run Code Online (Sandbox Code Playgroud)

  • 约翰为什么不帮助你并建议一个更好的方法来做到这一点. (7认同)
  • 我相信我的答案在问题所规定的范围内是有帮助的.我从未说过我推荐它用于新开发. (3认同)