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

问题描述 投票:5回答:2

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

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

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

先感谢您!

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

c# wcf rest dynamics-crm-2011
2个回答
9
投票

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

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

实施它的步骤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
投票

对于上面的问题,前面的答案已经足够了。但是,我想提出另一种方法:自定义令牌认证。

通过提供创建/支持基于身份验证令牌(UserName)创建的自定义服务凭据的可能性,它更加强大。

在我的情况下,我有加密访问令牌,其中包含访问所需的所有信息:用户名,用户组(授权信息),验证期等。

在您的情况下,它可以是用户名和密码。凭据将保存有关您的用户的信息,稍后可在代码中使用。

请参阅以下链接以实现自定义令牌身份验证:https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/token-authenticator

© www.soinside.com 2019 - 2024. All rights reserved.