2

我有一个 WCF 通道工厂,它的端点已针对 WCF 服务调用进行了修改。我想要的是在通常是直截了当的不同上下文中完成服务调用。但是它对我不起作用。我可以成功地将凭据添加到端点行为、检查它们并查看它们,但调用不是使用“NewUser”凭据进行的。

internal static void UpdateChannelClientBehavior(ChannelFactory factory)
{
   factory.Endpoint.Behaviors.Remove<ClientCredentials>();
   //MyCustomCredentials is a custom class class variable that inherits System.ServiceModel.Description.ClientCredentials
   MyCustomCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
   MyCustomCredentials.Windows.ClientCredential = new NetworkCredential("NewUser", "password", "MyDomain");
   factory.Endpoint.Behaviors.Add(MyCustomCredentials);
   return;
}

因此,在此代码之后,端点确实具有新的 Windows 凭据,但服务器端仍然在默认上下文下调用它,而不是使用“NewUsers”凭据。我做错了什么来完成这项工作?

谢谢!

4

2 回答 2

0

实际上这段代码确实有效:

internal static void UpdateChannelClientBehavior(ChannelFactory factory)
{
   factory.Endpoint.Behaviors.Remove<ClientCredentials>();
   //MyCustomCredentials is a custom class class variable that inherits System.ServiceModel.Description.ClientCredentials
   MyCustomCredentials.Windows.ClientCredential = new NetworkCredential("NewUser", "password", "MyDomain");
   factory.Endpoint.Behaviors.Add(MyCustomCredentials);
   return;
}

如果您直接实例化 WCF 客户端代理的实例,则可以这样做的另一种方法如下:

MyWcfService.MyWcfServiceServiceClient client = new MyWcfService.MyWcfServiceServiceClient();
client.ClientCredentials.Windows.ClientCredential = new NetworkCredential("NewUser", "password", "MyDomain");

我正在反复尝试进行代码更改,并且弄乱了影响此代码的下游内容。您确实可以使用上面的代码更改调用的上下文,以模拟进行 WCF 调用的不同用户。如果需要临时提升对 WCF 服务的调用,这会非常方便。

于 2012-11-05T14:37:02.600 回答
0

更改您的服务以使用“用户名”clientCredentialType 而不是“Windows”。然后更改您的客户端以使用用户名和密码凭据。默认情况下,WCF 将根据 Windows 帐户数据库检查凭据,除非您另有指定。

factory.Credentials.UserName.UserName = "NewUser";
factory.Credentials.UserName.Password = "password";

如果您使用“Windows”凭据类型,则无法更改它,它将始终在运行用户的上下文中。

于 2012-11-02T20:21:33.353 回答