我已经在我的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的客户端才能访问我的服务。这就是我所做的。但我不确定安全性,因为我认为如果有人入侵的话这个认证密钥从soap头在网络电线将能够访问我的服务。在这种情况下如何保护我的服务?请为我提供一个解决方案,以便只有选定的客户端可以访问我的服务
您的方案中的解决方案是HTTPS。你担心有人可以在网上窃取authkey =你需要有一个安全通道,最简单(在你的情况下是最好的)获得安全通道的方法是使用HTTPS。
我不知道为什么你提到密码/用户id在问题的标题,但如果你使用这个身份验证头只有成功认证的客户端,你很可能是重新发明轮子。WCF已经支持这个场景。它被称为SecurityContext(或安全会话),例如WSHttpBinding
使用Message
安全模型和UserName
客户端凭证类型-凭证仅在第一次请求时验证,之后客户端发送安全令牌,该令牌在整个会话期间有效。缺点是它使您的通信是有状态的。