WCF身份验证服务

4

我是一个相对新手,对WCF的世界还不太了解,所以我的问题可能比较初级。目前我正在设计一层WCF服务。其中之一是身份验证服务,因此我想出了以下身份验证机制:

IUserService.TryAuthenticateUser(string username, string password, out string key)

基本上,用户尝试进行身份验证,如果成功,则会收到一个会话密钥/安全密钥/其他密钥...然后该密钥对于每个其他的"WCF操作"都是必需的,例如:
IService.GiveMeMyFeatures(string key);
IService.Method1(string key);

这种机制对我来说看起来非常直观,而且实现起来也很容易,所以让我困惑的是为什么我找不到类似的WCF示例?这个唯一的键(实际上是一个带有WCF端过期时间的会话密钥)然后可以根据应用程序的架构从各种应用程序中使用:对于ASP.NET,它可以存储在Cookie中,对于Winform/WPF/Mobile,我想它可以存储在表单类中的一个字段中等等...

因此,问题1出现了:你认为这种方法怎么样?

我还读到过,我可以使用内置的ASP.NET身份验证服务(包括成员资格提供程序等...如果我理解正确的话)。从架构角度来看,我真的不喜欢这种方法,因为当从ASP.NET页面进行身份验证时,工作流程将如下所示:ASP.NET -> WCF -> ASP.NET身份验证服务 -> 响应

在这种情况下,人们还可以绕过WCF层并直接从asp.net页面调用auth.服务方法。我知道通过每个身份验证请求都要经过WCF层,我会失去一些性能,但对我来说拥有良好分层的架构非常重要...

这里是问题2:这种方法与第一种方法相比的优缺点是什么,为什么它如此受欢迎,从架构角度来看它有点不对?

我也读到过,我可以为每个WCF方法调用发送用户凭据,并使用内置机制对请求进行身份验证和响应。

问题3:你认为这种方法怎么样?

总之 - 显然有许多身份验证方法,但你认为哪种方法最好、最通用(考虑到将从asp.net/wpf/mobile等调用WCF服务)?

提前谢谢:)

1个回答

5

你找不到示例的原因并不是最佳实践-这会将应该是无状态的Web服务转变为有状态的东西,并且根本无法进行负载均衡。

由于Web服务已经具有标准的用户名和密码功能,并且几乎所有SOAP堆栈(不包括Silverlight)都支持,因此这就是正确的方法。您还可以使用标准的.NET基于角色的安全模型来保护此方法。


1
+1 - 你最好使用“每次调用”场景 - 每次调用都与上一次分离,调用之间不共享任何内容。 - marc_s
哦,我想我解释错了。我不想在调用之间共享信息,我只想确保调用来自有效的用户。我不喜欢每次通过网络发送密码的想法,因此我提出了“抽象”密钥概念...我稍微改进了这个想法-仍然使用UserService从用户名和密码获取密钥,但然后不是将密钥作为参数传递给每个wcf方法-只需使用自定义凭据。 - Krassi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接