服务器上有一个动态CRM 实例(“内部部署”)。它将由在远程计算机(另一个域,另一个Active Directory)上运行的一些站点使用。这些站点与CRM实例之间的通信是通过 CRM代理,靠近它(靠近CRM)的WCF服务,处理请求,查询CRM等来完成的。
该WCF服务面向互联网。虽然安全的通信渠道不是必需的,但认证是。我们不能让随机客户端使用CRM代理提供的服务。
那么,身份验证服务(cookies?)/手动编码令牌传递(作为每个服务操作的参数)/ this solution - on stackoverflow。
提前谢谢!
PS:手动编码的令牌将是“时间敏感的”,并使用一些密钥进行几次哈希处理。中间人可能不是一个大问题,因为在请求之后令牌可能会失效。
答案 0 :(得分:8)
手动编码令牌传递不是很优雅。它会污染您的方法签名,并使您在整个地方重复检查。
如果您能够向服务客户端分发凭据,或传递他们已用于您的系统的凭据,那么我建议使用带有自定义用户名的消息安全性&密码验证器。
实施它的步骤are simple enough。您只需要实现UserNamePasswordValidator
:
链接文章的简短配置摘要:
在绑定中指定安全模式:
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
在您的服务行为中添加:
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="YourFullUserNameValidatorType"/>
</serviceCredentials>
然后客户端只需要直接在服务代理上设置其凭据。所以他们没有通过服务运营。
serviceClient.ClientCredentials.UserName.UserName = "username";
serviceClient.ClientCredentials.UserName.Password = "password";
您的UserNamePasswordValidator
将为每个服务操作调用获取这些凭据,您将有机会根据您的凭据存储验证它们。
但是,为了更安全,您可以查看certificate authentication。它更可靠,您无需从CA购买证书。如果您还可以在客户端计算机上将自己设置为CA,那么您可以继续使用。这是合适的,特别是因为你只有几个客户,所以它们很容易管理。
答案 1 :(得分:0)
对于上面的问题,普遍的回答就足够了。但是,我想建议另一种方法:自定义令牌身份验证。
通过创建/支持基于身份验证令牌(UserName)创建的自定义服务凭据,这将更加可取。
就我而言,我已经加密了访问令牌,该令牌保存了访问所需的所有信息:用户名,用户组(授权信息),验证期限等。
在您的情况下,它可以是用户名和密码。该凭据将保存有关您的用户的信息,以后可以在代码中使用。
请参阅以下链接以实现自定义令牌认证: https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/token-authenticator