如何在WCF服务中实现安全性,以便只有选定的客户端才能访问我的服务(不检查每个方法中的userid / passwork)?

时间:2011-12-19 17:10:21

标签: wcf security header message idispatchmessageinspector

我已在我的WCF服务中实现IDispatchMessageInspector以提供安全性,如下所示。

客户端代码:

 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将能够访问我的服务。如何在这种情况下保护我的服务?请为我提供一个解决方案,以便只有选定的客户才能访问我的服务。

1 个答案:

答案 0 :(得分:1)

您的方案中的解决方案是HTTPS。你担心有人可以在网上偷走authkey =你需要拥有安全通道,最简单的(在你的情况下是最好的)获得安全通道的方法就是使用HTTPS。

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