2010-07-20 170 views
2

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

  1. 用户张贴到登录URI
  2. 服务认证用户如上述,但返回的会话令牌(加密的用户凭证)作为HTTP响应报头中。
  3. 来自用户的所有后续请求都包含会话令牌而不是基本验证。

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

  • 暴露了一些方式和邮件属性
  • 执行-before-定制UserNamePasswordValidator执行..

做任何你知道大师的这样的可扩展性点,还是一种定制传输安全机制的方式?我被这里的大量选项所困惑,并且在Reflector中浏览System.ServiceModel命名空间一直是一个令人沮丧的练习。

谢谢!

+0

我也想知道这是否可能。对于使用sessionKey进行后续认证请求的想法,还没有找到太多的东西。 – 2010-08-19 01:17:51

回答

2

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

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

这已经被证明是一个令人满意的解决方案,但是我还是很失望,没有找到我期待的扩展点。