1

我对 WCF 完全陌生,所以如果这个问题听起来很愚蠢,我很抱歉。

我想创建一个具有帐户管理功能的网络服务。我的意思是我有一个客户可以请求该服务来注册一个新帐户、登录并将事物链接到我的帐户。

这些帐户存储在 SQL Server 数据库中。

我有这个界面:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    bool Register(string username,  string password);
}

在实现该服务的类中,将新帐户输入到数据库中。

这是这样做的正确方法还是我应该以另一种方式这样做?另外,安全性如何?显然密码将在数据库中散列(我在方法中创建散列),但以明文形式将其发送到服务似乎不是正确的方法。

第二个问题是我想使用自定义 UserNamePasswordValidator 所以客户端只能在身份验证后调用方法(请参阅我之前的问题:基本身份验证和 WCF

问题是我想创建一个例外:除了注册方法之外,您必须为每个方法登录。有没有办法做到这一点?或者我应该为这种方法创建一个单独的服务?

我希望有人可以帮助我。

谢谢!

4

1 回答 1

1
  1. 在 WCF 中,您应该使用传输或消息安全来保护您的消息。实现这一点足以保护您的发送密码。传输安全性将为您提供 SSL/TSL,而消息安全性将根据 WS-Security 规范保护您的消息。如果你愿意,你可以同时使用它们。有关消息安全的优缺点,请参阅http://msdn.microsoft.com/en-us/library/ms733137.aspx和有关传输的http://msdn.microsoft.com/en-us/library/ms729700.aspx 。

  2. 在启用自定义验证之前,您必须实现上述安全模型之一。当您实施自定义验证时,这只是打开频道之前的另一项安全检查。例如,您有一个具有自定义安全性的代码

     factory = new ChannelFactory<IContract>(binding,
                    new EndpointAddress(address, EndpointIdentity.CreateX509CertificateIdentity(serviceCertificate)));
     factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;
     factory.Credentials.UserName.UserName = "admin";
     factory.Credentials.UserName.Password = "qwerty";
     channel = factory.CreateChannel();
    

当你创建这样的通道时,首先会有证书检查,然后在你的服务端它会调用 Validate() 方法。在那里,您可以检查您的登录名并通过并抛出异常,如果它们是错误的。所以 factory.CreateChannel() 将返回异常,并且不会构建通道,因此您将无法调用任何服务方法。如果您只想使用一种方法,我建议您仅将独立服务用于注册目的,或者您可以尝试将注册逻辑放入您的 Validate() 方法中。

于 2013-03-18T08:19:21.513 回答