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

时间:2012-07-05 17:34:45

标签: c# wcf rest dynamics-crm-2011

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

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

那么,身份验证服务(cookies?)/手动编码令牌传递(作为每个服务操作的参数)/ this solution - on stackoverflow

提前谢谢!

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

2 个答案:

答案 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