WCF:身份验证服务或基于令牌的安全性?

tur*_*ula 7 c# rest wcf dynamics-crm-2011

服务器上有一个Dynamic CRM实例("内部部署").它将由在远程计算机上运行的一些站点(另一个域,另一个Active Directory)使用.这些站点与CRM实例之间的通信是通过CRM代理,位于其附近的WCF服务(靠近CRM),处理请求,查询CRM等完成的.

该WCF服务面向Internet.虽然安全的通信渠道不是必需的,但认证是.我们不能让随机客户端使用CRM代理提供的服务.

那么,身份验证服务(cookies?)/手动编码令牌传递(作为每个服务操作的参数)/ 此解决方案 - 在stackoverflow上.

先感谢您!

PS:手动编码的令牌将是"时间敏感的",并使用一些密钥进行几次哈希处理.中间人可能不是一个大问题,因为在请求之后令牌可能无效.

Mar*_* N. 11

手动编码令牌传递不是很优雅.它会污染您的方法签名,并使您在整个地方重复检查.

如果您能够将凭据分发给您的服务客户端,或传递他们已用于您的系统的凭据,那么我建议使用带有自定义用户名和密码验证器的邮件安全性.

实现它的步骤很简单.你只需要实现一个UserNamePasswordValidator:

链接文章的简短配置摘要:

在绑定中指定安全模式:

<security mode="Message">
    <message clientCredentialType="UserName"/>
</security>
Run Code Online (Sandbox Code Playgroud)

在您的服务行为中添加:

<serviceCredentials>
    <userNameAuthentication 
        userNamePasswordValidationMode="Custom" 
        customUserNamePasswordValidatorType="YourFullUserNameValidatorType"/>
</serviceCredentials>
Run Code Online (Sandbox Code Playgroud)

然后,客户端只需要在服务代理上直接设置其凭据.所以他们没有通过服务运营.

serviceClient.ClientCredentials.UserName.UserName = "username";
serviceClient.ClientCredentials.UserName.Password = "password";
Run Code Online (Sandbox Code Playgroud)

UserNamePasswordValidator将获得每个服务操作调用的这些凭据,您将有机会根据您的凭据存储验证它们.

但是,为了更安全,您可以查看证书身份验证.它更可靠,您无需从CA购买证书.如果您还可以在客户端计算机上将自己设置为CA,那么您可以继续使用.这是合适的,特别是因为你只有几个客户端,所以它们很容易管理.