我正在使用某种身份验证开发WCF服务。
所有用户都是平等的,所以我计划要求会话,并且只有一个启动会话但不会终止会话的方法。简化:
[OperationContract(IsInitiating = true, IsTerminating = false)]
void Open(String user, String password);
因此,如果密码错误(再次,这是一个简化),我会提出异常,以便会话结束。这样,我不需要在每个方法调用中检查凭据。
这是一个好方法吗?如果没有,为什么?
更新:我不得不匆匆写这篇文章,所以我会稍微详细说明一下,让我的问题更清楚。
身份验证方法是一项要求,我不是在询问它。我想了解会话管理。
当我使用[OperationContract(IsInitiating = true,IsTerminating = false)]时会启动会话。我不需要存储ID或任何东西; WCF管理一切。当引发异常或调用IsTerminating = true的方法时,会话结束,后续对服务方法的调用失败,直到启动新会话。
我想知道的是,如果攻击者绕过WCF会话管理的东西是相当容易的,在没有调用Open的情况下自己创建一个,这是我的服务的唯一方法,IsInitiating = true和IsTerminating = false,所以,合法开始会议的唯一途径。
答案 0 :(得分:2)
根据您选择的绑定,WCF会话可以保证安全。
http://msdn.microsoft.com/en-us/library/ms731172.aspx
但是,我建议上述方法不起作用,因为您的方法没有向调用客户端返回任何值,以指示在后续调用中应该传递的内容(即会话ID)以进行身份验证。
更好的方法可能是在绑定中进行所有安全检查(请参阅上面的链接以获取大量选项),让服务本身只是公开方法而不用担心验证客户端。
答案 1 :(得分:1)
是的,恶意客户端“劫持”经过身份验证的会话将是微不足道的,除非您使用潜在的通信拦截器无法访问的加密密钥加密所有带有会话标识符的通信。同样,如果没有足够的加密和反重播保护,他们也可以截取传输的用户名和密码。
有些需求需要在实施选择开始后重新审视。听起来这可能是其中一种情况......