1

我有一个ServiceHost在各种端点和绑定上实现许多联系人((http & https) x (rest & soap) 与匿名访问、Windows 或自定义身份验证,根据合同绑定)和 nettcp 与 Windows 身份验证。自定义身份验证嵌入在 http 或 soap 标头中。每个端点和合约都有其用途。这一切都应该在一个单一的管理ServiceHost- 我不想把它分开。

我已经达到了所有端点都可以正常工作并正确提供其内容的地步,但是身份验证/授权并未集成到 WCF 堆栈中。我一直在使用 aMessageInspector来处理身份验证标头的验证,并在令牌有效时允许它。

现在我想将身份验证/授权集成到 WCF 堆栈中。我希望能够访问身份并检查每个操作实现中的声明。也许可以集中授权基本声明,例如“这些声明是否授权了本合同中的任何内容?” (按合同类型)。

在自定义身份验证的情况下,我有一个签名/安全令牌,其中包括身份和属性声明的自定义实现,我可以在收到时正确提取并转换为 WCF 声明(即使我不知道将它们放在哪里一次我有他们)。对于 Windows 身份验证,我只需要访问默认的 Windows 身份信息。

我可以将ServiceAuthenticationManagerand ServiceAuthorizationManagereach 设置为自定义值,但它没有做任何我想做的事情,我完全迷失了。

例如,ReadOnlyCollection<IAuthorizationPolicy> authPolicy进入Authenticate()似乎是不一致的——有时它是空的,有时它有一个UnconditionalPolicy,有时它已经有 2 个或更多(4 个?)我的习惯IAuthorizationPolicy。同时IAuthorizationPolicy.Evaluate()每个请求执行 0 到 ~9 次。有时,内IAuthorizationPolicy.Evaluate()OperationContext.Currentnull!有时evaluationContext.ClaimSets已经有了我的声明集。然而state,即使我在以前的法规中给它一个值,它也总是为空。

与其单独解决这些问题,我认为最好退后一步,要求对我应该做什么/期望看到什么进行一些高级解释。

身份验证:当请求进入 ServiceHost 时,需要进行身份验证。在管道的这一点上,我不需要知道他们能做什么,只知道他们是谁。如果客户端将 Windows 凭据自定义身份验证票证提交给我只需要自定义身份验证票证的合同/绑定,则不应欺骗服务评估错误的票证。但也许在 WCF 管道的这个阶段,合同还没有解决,所以也许在这个阶段,所有找到的身份/声明/令牌都应该被捕获并在以后选择。这是正确的吗?这是怎么做到的?

消息检查:我有一个自定义 MessageInspector,在某些端点上我仍然需要它来支持 CORS 和 OPTIONS 请求处理。我相信这发生在身份验证之后和授权之前。在 OPTIONS 的情况下,我设置ref messagenull并完全跳过操作,直接跳到BeforeSendReply. 客户端不会在 CORS OPTIONS 预检请求中发送 auth-token,因此我无条件地允许这些请求。

授权:根据合同,我想要求某些身份验证机制并忽略其他机制。我相信一些设置需要将线程主体和操作上下文主体准备为正确的值。似乎可以同时使用多个授权策略。他们如何互动?

操作:我希望能够实现每个操作,假设调用者的身份使用支持的身份验证(通过合同,我可以在某处维护硬编码一次)进行身份验证,并获得经过验证的调用者身份并声明简单权限检查已验证的声明。

我如何实现这一点(代码优先于配置 xml)?

谢谢!

4

0 回答 0