WS-Security是Web服务安全标准,它定义了如何在SOAP消息中实现端到端的安全性。UsernameToken是WS-Security规范中的一种简单认证机制,允许客户端通过用户名和密码进行身份验证。
首先需要在ASMX服务端启用WS-Security并配置UsernameToken验证:
// 在web.config中配置
<system.web>
<webServices>
<soapExtensionImporterTypes>
<add type="Microsoft.Web.Services3.Description.WseExtensionImporter, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</soapExtensionImporterTypes>
</webServices>
</system.web>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="SecureBinding">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" />
</security>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[Policy("UsernamePolicy")]
public class SecureService : System.Web.Services.WebService
{
[WebMethod]
public string SecureMethod()
{
// 获取安全令牌
UsernameToken token = RequestSoapContext.Current.Credentials.UltimateReceiver.GetClientToken<UsernameToken>();
// 验证凭据
if (token != null && ValidateUser(token.Username, token.Password))
{
return "认证成功!";
}
throw new SecurityException("无效的凭据");
}
private bool ValidateUser(string username, string password)
{
// 实现你的验证逻辑
return username == "validUser" && password == "validPassword";
}
}
客户端需要使用WSE 3.0或更高版本来添加UsernameToken:
// 添加服务引用后
SecureService proxy = new SecureService();
proxy.Url = "https://yourserver/SecureService.asmx";
// 创建UsernameToken
UsernameToken token = new UsernameToken("validUser", "validPassword", PasswordOption.SendPlainText);
// 设置凭据
proxy.SetClientCredential(token);
proxy.SetPolicy("UsernamePolicy");
try
{
string result = proxy.SecureMethod();
Console.WriteLine(result);
}
catch (Exception ex)
{
Console.WriteLine("错误: " + ex.Message);
}
问题1:收到"无法找到请求的安全令牌"错误
问题2:认证总是失败
问题3:WSE 3.0配置问题
对于新项目,建议考虑使用WCF替代ASMX,它提供了更现代和灵活的WS-Security实现。
// WCF服务配置示例
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IYourService">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" />
</security>
</binding>
</wsHttpBinding>
</bindings>
WS-Security和UsernameToken为ASMX Web服务提供了基本的安全保障,但在现代应用中,应考虑使用更强大的安全机制如OAuth 2.0或OpenID Connect。