服务器端的WCF客户端身份验证

时间:2012-04-02 10:08:33

标签: wcf authentication impersonation

我的客户端有这样的结构。

WindowsIdentity wi = WindowsIdentity.GetCurrent();
IntPtr token = wi.Token;

下一步是通过WCF向服务器发送身份验证令牌并在那里模拟用户。

api.SendToken(token);

...
...
...

但是,一旦我在服务器端收到令牌并尝试构建WindowsIdentity,它就会引发错误:

WindowsIdentity newId = new WindowsIdentity(token);

Invalid token for impersonation - it cannot be duplicated.

请各位帮助我弄清楚我做错了什么并分享您的想法如何将令牌从客户端传递到服务器。

谢谢!

1 个答案:

答案 0 :(得分:1)

WCF已经内置管道来支持Windows impersonation.您是否有理由尝试自己推广?

更新以避免仅限链接的答案(啊,我年轻时的错误......)

以下是配置内置WCF模拟所需的基本步骤

  • 只有一些绑定支持Windows身份验证。 WSHttpBinding是最常用的支持它,但其他人也可以支持它。

  • 在服务合同上,对需要模拟的方法使用OperationBehavior属性:

    [OperationBehavior(Impersonation=ImpersonationOption.Required)]
    public string SomeMethod(string aParameter) { ... }
    
  • 对于客户端,最简单的方法是创建一个继承自ClientBase类的自定义类。所有服务引用类型都继承自此类。以下是客户端代码的示例:

    var client = new SomeClientBaseDerivedType("TheServiceEndpoint");
    client.ClientCredentials.Windows.AllowedImpersonationLevel =
        System.Security.Principal.TokenImpersonationLevel.Impersonation;