c# - WCF:身份验证服务还是基于 token 的安全性?

标签 c# wcf rest dynamics-crm-2011

服务器(“本地”)上有一个动态 CRM 实例。它将被在远程机器(另一个域,另一个 Active Directory)上运行的一些站点使用。这些站点和 CRM 实例之间的通信是通过 CRM 代理 完成的,这是一个位于它附近(CRM 附近)的 WCF 服务,可处理请求、查询 CRM 等。

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

因此,身份验证服务(cookies?)/手工编码的 token 传递(作为每个服务操作的参数)/this solution - on stackoverflow .

提前致谢!

PS:手工编码的 token 将是“时间敏感的”,并使用一些 secret key 进行几次哈希处理。中间人可能不是什么大问题,因为 token 可以在请求后失效。

最佳答案

手工编码的 token 传递不是很优雅。它会污染您的方法签名并让您到处重复检查。

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

实现步骤are simple enough .你只需要实现一个 UserNamePasswordValidator :

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

在绑定(bind)中指定安全模式:

<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,那么您就可以开始了。这很合适,尤其是因为您只有几个客户,所以他们很容易管理。

关于c# - WCF:身份验证服务还是基于 token 的安全性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11349539/

相关文章:

javascript - 如何使用 Node.js 发出 https 请求? - Myscript 在 http.get 中产生 TypeError

c# - WCF REST - 是否可以在不结束执行的情况下返回响应?

c# - 更新线段树中的一项

c# - WCF:有没有办法删除 ExtensionData 字段?

c# - 短信客户端URL预览检测

c# - 如何将流中的图像另存为在 retrofit2 中发送到 wcf web 服务

wcf - Azure 托管的 WCF 中基于角色的授权

rest - 将 GO map 转换为结构

c# - DirectoryEntry.Invoke ("groups",null) 未检索所有组?

c# - 动态创建 HTML 按钮控件并在其中嵌套 i 标记