三台机器都在同一个域
- 机器 1 - 具有在 user1 下运行的应用程序,从那里生成请求
- 机器 2 - 是在托管 WCF 服务的网络服务下运行的 Windows 服务,使用 WSHttpBinding
- 机器 3 - 共享文件夹,其中 user1 有权写入该文件夹
理想情况下,WSHttpBinding 自动将安全上下文从应用程序传输到 WCF 服务,因此它应该能够在共享位置写入文件。因为,如果我们直接尝试将文件从机器 1 上的应用程序写入到机器 3 共享位置,它是成功的。
但是,令我们惊讶的是,它无法通过服务将文件写入共享位置。我们收到“拒绝访问”
正如我所说,我们正在使用 WSHttpBinding,理想情况下,用户上下文被传输到服务。在客户端,即机器1,模拟级别设置为System.Security.Principal.TokenImpersonationLevel.Impersonation;因此网络服务可以将自己模拟为 Domain\user1。这足以写入第三台机器的文件夹吗?
或者我们应该将 Client impersonation Level 设置为 System.Security.Principal.TokenImpersonationLevel.Delegation? (我们都试过了,都不行)
另外,还有一条信息: 机器 2 是“受信任的委托(delegate)”。在域 Controller 中为此机器设置了 SPN。
操作合约声明为
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public void WriteData(string content)
{
}
我们仍然面临这个问题。
最佳答案
你需要delegation为了那个原因。模拟仅在机器 2 上具有本地作用域。
关于c# - WCF 的凭证委托(delegate)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6463776/