我有一个托管在 IIS (.svc) 中的每次调用 WCF 服务。在服务的构造函数中,我按照 this article 设置了 Thread.CurrentPrincipal = HttpContext.Current.User .在这种情况下, HttpContext.Current.User 是 Microsoft.IdentityModel.Claims.ClaimsPrincipal 类型,并且具有从我的自定义被动 STS 发回的声明。
但是,一旦我进入我的服务操作并检查 Thread.CurrentPrincipal,虽然此对象仍为 Microsoft.IdentityModel.Claims.ClaimsIdentity 类型,但该对象本身不再与 HttpContext.Current.User ( ) 相同。 IsAuthenticated = false, AuthenticationType = ""并且 Name 在 Thread.CurrentPrincipal.Identity 上为空),而这些值仍然在 HttpContext.Current.User 上正确填写。这告诉我有什么东西正在拦截对操作的调用,并错误地将当前主体更改为某个通用的、空的、未经身份验证的声明主体。
我在构造函数和操作中检查了线程 ID,它在两个地方都是一样的,并且在从 HttpContext.Current.User 分配后在立即窗口中评估 Thread.CurrentPrincipal 表明线程标识在构造函数,因此肯定在构造函数和方法之间执行了某些操作,并且某些内容正在更改我的 Thread.CurrentPrincipal。
有没有人知道这是做什么的,我该如何预防/修复这种行为?
最佳答案
我刚刚遇到了类似的问题。我在 WCF 服务的构造函数中设置了我的自定义主体。当我离开构造函数并进入我调用的方法时,thread.currentprincipal 被一个空的覆盖。我通过添加以下行为解决了这个问题:
<serviceAuthorization principalPermissionMode="None"></serviceAuthorization>
这对我来说很好。
关于wcf - ASP.Net WCF 服务的 Thread.CurrentPrincipal 被联合 (WIF) 环境中的某些拦截器丢弃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1932424/