【问题标题】:WCF Service - Custom PrincipalWCF 服务 - 自定义主体
【发布时间】:2011-04-14 13:58:09
【问题描述】:

在我的 WCF 服务类的构造函数中,我将当前主体设置为消息头中传递的主体:

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

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

大概该方法在不同的线程上触发。如何确保该方法使用的是服务构造函数中设置的主体?

【问题讨论】:

  • 你需要解释你想要达到的目标是什么。您想在不同的帐户/模拟下运行您的服务吗?当然,处理传入请求的线程与创建服务的线程不同。
  • 您在哪里执行此代码:“将当前主体设置为消息头中传递的主体的主体” - 我很感兴趣,因为我有类似的问题。

标签: wcf principal


【解决方案1】:

我刚刚找到了原始问题的答案。为了停止 WCF 用空白覆盖主体,请在行为配置中设置以下内容:

<serviceAuthorization principalPermissionMode="None" />

就这么简单,无需对现有代码库进行彻底的更改。

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

【讨论】:

  • 我也这样做了,谢谢!我尝试在验证用户凭据(在 UserNamePasswordValidator 中)时设置主体,并且可以在我的服务中检索它。无论如何,我想知道您是否遇到了一些神秘的问题,因为每个人(和 ms 文档)都说:“在自定义授权策略中设置您的主体”。提前再次 Tnx。
【解决方案2】:

WCF 始终在 AuthorizationPolicy 中设置主体,因此它可能会覆盖您的更改。您应该实现custom authorization policy 并在那里设置主体。

【讨论】:

  • principalPermissionMode="Custom" +1。另一个有用的例子是 OAuthResourceServer 的 DotNetOpenAuth 示例代码
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 2011-11-26
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多