0

我已经IDispatchMessageInspector在我的 WCF 服务中实现了如下所示的安全性。

客户端代码:

 private class mySecurityInspector : IClientMessageInspector, IDispatchMessageInspector
  {
   private const string HEADER_NS = "urn:myservice:authentication-header:2011";

   public object BeforeSendRequest(ref Message request, IClientChannel channel)
   {
     MessageHeader<string> messageHeader = new MessageHeader<string>  
                              (getAuthKeyFromConfig(), false, string.Empty, false);

    // add the new header to our request
     request.Headers.Add(messageHeader.GetUntypedHeader("",                   
                                                   HEADER_NS));
      return null;
    }

}

服务器端(服务):

 private class mySecurityInspector: IDispatchMessageInspector
 {
   private const string HEADER_NS = "urn:myservice:authentication-header:2011";

  public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request,     
      System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext            
               instanceContext)
     {

            string authKey = request.Headers.GetHeader<string>(“”, HEADER_NS);
             if (authKey != getAuthKeyFromConfig())
            {
               throw new 
              Exception(string.Format(ServiceMessages.MSG_UNAUTHORISED_CLIENT,  
             "");
   }

}

}

这样,只有知道 authkey 的客户才能访问我的服务。这就是我所做的。但我不确定安全性,因为我认为如果有人以某种方式从网络线路上的肥皂中破解此 authkey 将能够访问我的服务。在这种情况下如何保护我的服务?请为我提供一个解决方案,以便只有选定的客户才能访问我的服务。

4

1 回答 1

1

您的方案中的解决方案是 HTTPS。您担心有人可以在线窃取 authkey = 您需要拥有安全通道,而获得安全通道的最简单(在您的情况下也是最好的)方法是使用 HTTPS。

我不确定您为什么在问题的标题中提到密码/用户 ID,但是如果您仅将此身份验证标头用于成功通过身份验证的客户端,则很可能是在重新发明轮子。WCF 已经支持这种情况。它被称为 SecurityContext(或安全会话),例如,它WSHttpBindingMessage安全模型和UserName客户端凭据类型一起使用 - 仅在第一个请求时验证凭据,然后客户端发送在整个会话期间有效的安全令牌。缺点是它使您的通信有状态。

于 2011-12-19T18:17:57.310 回答