如何安全地向公共Web服务传输数据或从公共Web服务传输数据

时间:2010-11-18 10:12:22

标签: c# .net web-services webservices-client

我正在处理与远程盒子上运行的现有应用程序接口的应用程序。与远程应用程序的通信是通过其公共Web服务。我被要求构建一个增强功能,它将使客户利用Web服务来处理需要安全传输的敏感数据。

有人能给我一些关于如何最好地进行的指示吗?

2 个答案:

答案 0 :(得分:4)

首先,您应该使用SSL并拒绝任何未使用它的请求。这将对通过Internet传输的数据进行加密。

如果您使用的是SOAP,则可以在服务中定义一个带有用户名/密码的自定义标头。然后,对于每个公共方法中的第一行,验证数据库的用户名和密码。如果成功,请适当地设置HttpContext.Current.User,您的服务将与内置的Asp.NET基础结构很好地配合。

ADDED:以下是一个示例SoapHeader,其中包含用于身份验证的用户名/密码。

// define the header
public class AuthenticationHeader : SoapHeader
{
    public String UserName { get; set; }
    public String Password { get; set; }
}

// your service
public class PublicWebService : WebService
{
    // defines an instance of the header as part of the service
    public AuthenticationHeader Authentication;

    private void Authenticate()
    {
        // validate the username / password against a database
        // set the HttpContext.Current.User if successful.
        // Maybe throw a SoapException() if authentication fails
    }

    // Notice the SoapHeader("Authentication") attribute...
    // This tells ASP.Net to look for the incoming header for this method...
    [WebMethod]
    [SoapHeader("Authentication")]
    public void PublicMethod1()
    {
        Authenticate();

        // your code goes here
    }

    // Expose another method with the same authentication mechanism
    [WebMethod]
    [SoapHeader("Authentication")]
    public void PublicMethod2()
    {
        Authenticate();

        // your code goes here
    }
}

现在,如果运行wsdl工具,生成的代理类将包含已定义的身份验证标头:

PublicWebService s = new PublicWebService();
s.Authentication = new AuthenticationHeader();
s.Authentication.UserName = "xxxxxxxx";
s.Authentication.Password = "yyyyyyyy";
s.PublicMethod1();
s.PublicMethod2();

答案 1 :(得分:-1)

DIY路线:

  1. 阅读安全性(以“Secrets and Lies”和其他此类通用书籍开头,然后再进行技术性工作)

  2. 执行风险分析和线程评估。了解您所保护的内容以及威胁的来源和威胁。您不太可能需要“高安全性” 1

  3. 使用TLS(又名SSL)。

  4. 在客户端中,验证服务器的证书是否正确。

  5. 更好的路线: 聘请具有良好声誉的专家来帮助您。


    1 除非你真的在建造核武器厂或类似物。