WCF服务授权管理器设置Thread.CurrentPrincipal

3

我有一个自定义的ServiceAuthorizationManager,其中我重写了CheckAccess并验证了作为URL一部分的自定义身份验证令牌。在验证后,我使用GenericPrincipal设置Thread.CurrentPrincipal。但是当请求最终到达我的服务方法时,Thread.CurrentPrincipal消失了,它不是我在身份验证管理器中设置的内容。

出了什么问题?

2个回答

6
我通过在注册服务授权管理器的服务行为中设置principalPermissionMode =“None”来解决了这个问题。这应该告诉WCF运行时不要在当前线程中放置任何主体。如果将其设置为“custom”,它将覆盖使用GenericPrincipal设置的任何主体。

那么你是如何实现你提到的自定义认证的呢?使用'None'的PrincipalPermissionMode模式是否可行? - Phil Degenhardt
我在登录时发送一个授权票据,客户端会跟踪它并在后续服务中使用它。如果授权票据无效,我只需从我的ServiceAuthorizationManager实现中返回false。如果它是有效的,我会在当前线程上设置一个通用主体。如果您不将principalPermissionMode设置为None,则刚刚设置的通用主体将在某个地方被覆盖。 - sash

1
如果您不希望使用内置的授权机制,WCF要求通过IAuthorizationPolicy来识别当前主体,以便在WCF管道中进行正确集成。您需要指定PrincipalPermissionMode为“Custom”。
有关详细介绍,请参阅本文:WCF-Based服务中的授权

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接