服务器上有一个Dynamic CRM实例(“内部部署”)。它将由在远程计算机上运行的一些站点(另一个域,另一个Active Directory)使用。这些站点与CRM实例之间的通信是通过CRM代理,位于其附近的WCF服务(靠近CRM),处理请求,查询CRM等完成的。
该WCF服务面向Internet。虽然安全的通信渠道不是必需的,但认证是。我们不能让随机客户端使用CRM代理提供的服务。
那么,身份验证服务(cookies?)/手动编码令牌传递(作为每个服务操作的参数)/ this solution - on stackoverflow。
先感谢您!
PS:手动编码的令牌将是“时间敏感的”,并使用一些密钥进行几次哈希处理。中间人可能不是一个大问题,因为在请求之后令牌可能无效。
手动编码令牌传递不是很优雅。它会污染您的方法签名,并使您在整个地方重复检查。
如果您能够将凭据分发给您的服务客户端,或传递他们已用于您的系统的凭据,那么我建议使用带有自定义用户名和密码验证器的邮件安全性。
实施它的步骤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,那么您可以继续使用。这是合适的,特别是因为你只有几个客户端,所以它们很容易管理。
对于上面的问题,前面的答案已经足够了。但是,我想提出另一种方法:自定义令牌认证。
通过提供创建/支持基于身份验证令牌(UserName)创建的自定义服务凭据的可能性,它更加强大。
在我的情况下,我有加密访问令牌,其中包含访问所需的所有信息:用户名,用户组(授权信息),验证期等。
在您的情况下,它可以是用户名和密码。凭据将保存有关您的用户的信息,稍后可在代码中使用。
请参阅以下链接以实现自定义令牌身份验证:https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/token-authenticator