使用 WCF 的身份验证服务

Posted

技术标签:

【中文标题】使用 WCF 的身份验证服务【英文标题】:Authentication Service using WCF 【发布时间】:2012-03-23 23:03:38 【问题描述】:

我有一个自定义 MembershipProvider,如下所示。它根据 Active Directory 验证用户名和密码。我想将此作为“身份验证服务”。即使客户端使用表单身份验证或 Windows 身份验证,这也应该可以工作。

有一个提供员工信息的 WCF“人力资源服务”。 “HR UI”网站正在使用“HR Service”WCF 服务。现在我们需要确保任何使用“人力资源服务”的客户端在访问“人力资源服务”的操作之前都应该使用“身份验证服务”进行身份验证。如果客户端应用程序通过了一次身份验证,则下次不应再次对其进行验证(直到应用程序关闭)。当客户端应用程序的新实例打开时,需要从头开始进行身份验证。

我们如何实现它?我们有端到端流程演示的代码示例吗?

注意:我应该能够使用自托管服务对其进行测试。

注意:客户端可以是任何平台(例如 Java)。

namespace LijosCustomValidation

public sealed class LijoMembershipProvider : MembershipProvider


    public override bool ValidateUser(string username, string password)
    
        bool isValid = true;
 //my logic to validate the user name and password
        return isValid;
    

   //other implementations of Abstract Methods from MembershipProvider
  

【问题讨论】:

【参考方案1】:

如果身份验证成功,您的身份验证服务应该返回一个令牌。然后,此令牌应依次提交给 HR 服务。

对于 HR 服务此时的工作,您有多种选择。它可以知道验证令牌的秘密,也可以调用身份验证服务来验证令牌。

如果您知道秘密,令牌应该是可以验证的某个值,因此它可以是对称加密的用户 ID。理想情况下,它应该有一个时间组件来防止重放攻击。

我会建议一些类似的东西

<hash value>|<token issue time>|<user id>

哈希值应该是第一个管道之后所有内容的哈希值(sha1、md5 等)。然后,您可以对结果进行 base64 编码并将其传递。然后验证令牌可以检查发行日期是否在特定时间范围内。

您还可以选择将客户端中的令牌存储在 cookie 中并作为 cookie 传递给服务,或者将其作为服务的参数。可能还有其他选项,具体取决于您的客户端架构以及您希望如何构建服务。

【讨论】:

谢谢西蒙。您是否可以给我一个这样的实现的参考 - 端到端? 恐怕我不知道这样的实现。我的建议只是基于我应对此类挑战的经验。

以上是关于使用 WCF 的身份验证服务的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.Net MVC 应用程序中使用来自 WCF 身份验证服务的身份验证 cookie

WCF 用户身份验证和授权

WCF 身份验证错误

WCF与相互身份验证

无法使用 WCF 调用具有基本身份验证的 Web 服务

如何在 WCF 服务中实现自定义身份验证