2

我有一个使用基本身份验证的 RESTful WCF 服务、一个自定义服务主机和一个 . 我已经设置了一个自定义的 UserNamePasswordValidator,并且一个自定义的 IPrincipal 正确地流向了操作。但是,对于遗留互操作性,我需要支持不同的身份验证模式。它应该工作的方式是:

  1. 用户 POST 到登录 URI
  2. 该服务如上所述对用户进行身份验证,但返回会话令牌(加密的用户凭据)作为 HTTP 响应标头。
  3. 来自用户的所有后续请求都包含会话令牌而不是基本身份验证。

我目前的想法是:如果会话令牌包含加密的凭据,那么应该可以操纵传入的消息,解密凭据并用基本身份验证标头替换会话标头。我的问题是找到一个可扩展点:

  • 以某种方式公开消息属性 AND
  • 在自定义 UserNamePasswordValidator 执行之前执行。

你们中的任何一位大师都知道这样的可扩展点,或者自定义传输安全机制的方法吗?老实说,我对这里的大量选项感到困惑,在 Reflector 中浏览 System.ServiceModel 命名空间一直是一种令人沮丧的练习。

谢谢!

4

1 回答 1

2

我自己发现了答案,答案是我无法弄清楚如何实现问题中概述的确切机制 - 即在密码验证之前用另一个 HTTP 标头替换。

相反,我用 IAuthorizationPolicy 替换了 UserNamePasswordValidator。在策略的 Evaluate 方法中,另一个类处理基本凭据或会话密钥的检查,并返回自定义 IIdentity。这里的关键是,在成功验证后,包含自定义 ID 的新列表将添加到 evaulationContext 的“Identities”属性中,并将自定义主体添加到“主体”属性中。一旦设置了这些属性,WCF 就会正确地将主体传递给操作。

这已被证明是一个令人满意的解决方案,但我仍然很失望没有找到我正在寻找的可扩展点。

于 2010-08-26T04:17:09.437 回答