2010-09-20 92 views
3

在我的WCF服务类,我在设置当前主要是在消息的头通过主体的构造函数:WCF服务 - 自定义用户

Thread.CurrentPrincipal = OperationContext.Current.IncomingMessageHeaders.GetHeader<BBPrincipal>("bbPrincipal", "ns"); 

这似乎是工作正常,但是当我在一个方法中引用主体时,Thread.CurrentPrincipal已经恢复为WindowsPrincipal。

推测该方法是在不同的线程上触发。我如何确保该方法在服务的构造函数中使用主体集?

+1

你需要解释什么是你想达到的目标。你想在另一个帐户/模拟下运行你的服务吗?当然,处理传入请求的线程将与创建服务的线程不同。 – Aliostad 2010-09-20 09:17:52

+0

你在哪里执行这段代码:“将当前主体设置为在消息头部传递的主体的主体” - 我非常感兴趣,因为我有类似的问题。 – 2014-08-12 03:23:42

回答

7

我刚刚找到了我原来的问题的答案。为了阻止WCF为空白覆盖本金,设置行为的配置如下:

<serviceAuthorization principalPermissionMode="None" /> 

这么简单,也不需要做出彻底改变现有的代码库。

请参见:http://connect.microsoft.com/VisualStudio/feedback/details/369445/wcf-service-configured-for-transport-security-shouldnt-change-thread-currentprincipal

+0

我也这么做了,谢谢!我尝试设置主体,同时验证用户凭证(在UserNamePasswordValidator中),并可以在我的服务中检索它。 无论如何,我想知道你是否经历过一些神秘的问题,因为每个人(和MS文档)都说:“在自定义授权策略中设置你的主体”。 Tnx再次提前。 – 2012-09-09 18:15:47

+0

正是我在找的,谢谢! – 2013-08-06 09:16:58

4

WCF总是在AuthorizationPolicy中设置主体,以便它可能会覆盖您的更改。您应该执行custom authorization policy并在那里设置主管。

+0

对于principalPermissionMode =“Custom”+1。另一个有用的例子是[OAuthResourceServer]的DotNetOpenAuth示例代码(https://github.com/DotNetOpenAuth/DotNetOpenAuth/tree/master/samples/OAuthResourceServer/Code) – 2012-10-05 06:15:45

相关问题