通过端点/合同将自定义httpHeader或soap标头定制到基于声明的授权中

时间:2013-07-21 19:13:23

标签: c# wcf authentication authorization .net-4.5

我有ServiceHost在各种端点和绑定((http& https)x(rest& soap)上使用匿名访问,Windows或自定义身份验证实现多个联系人,具体取决于合同)& nettcp与Windows身份验证。自定义身份验证嵌入在http或soap标头中。每个端点和合同都有其目的。它应该可以在一个ServiceHost上进行管理 - 我不想将其拆分。

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

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

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

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

例如,进入ReadOnlyCollection<IAuthorizationPolicy> authPolicy的{​​{1}}似乎不一致 - 有时它是空的,有时它有一个Authenticate(),有时它有2个或更多(4?)我的自定义UnconditionalPolicy已存在。同时IAuthorizationPolicy每次请求执行0到~9次。有时,在IAuthorizationPolicy.Evaluate()内,IAuthorizationPolicy.Evaluate()OperationContext.Current!有时null已经有我的索赔权。然而,即使我在之前的一个法案中给它一个值,evaluationContext.ClaimSets也总是为空。

我认为不应单独处理这些问题,而是要退一步,并要求对我应该做什么/期望看到的内容进行一些高级别的解释。

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

消息检查:我有一个自定义MessageInspector,我仍然需要在某些端点上进行CORS支持和OPTIONS请求处理。我相信这在认证之后和授权之前发生。对于OPTIONS,我将state设置为ref message并完全跳过操作,直接跳到null。客户端不会在CORS OPTIONS预检请求上发送auth-token,因此我无条件地允许这些请求。

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

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

我如何实现这一点(首选的代码优于config xml)?

谢谢!

0 个答案:

没有答案