2

我目前正在审查一个带有 wcf 服务的系统和一个使用 Windows Auth 通过 tcp 连接到它的客户端应用程序。

在某些操作中,需要将用户名存储在对象属性上,将其发送到服务并将其与从客户端传递的凭据进行比较。然后对该对象进行进一步处理。

客户最近发现,这并不总是按预期工作。我研究了这个问题,发现在某些情况下,客户端和服务器端使用了不同的用户名(大小写的用法不同)。

我已经安装了一个解决方法(显然在 string.Equals 中使用了 IgnoreCase 选项)但是我对真正的修复很感兴趣。

在客户端它使用 WindowsIdentity.Current.Name 作为字符串,在服务端它使用 ServiceSecurityContext.Current.WindowsIdentity.Name 作为字符串。

进行这种比较的正确方法是什么?

4

1 回答 1

0

客户端和服务器是否在同一个域中?如果是这样,请存储并比较对象User上的属性WindowsIdentity而不是用户名。这是用户的安全标识符 (SID),它是(简化)Windows 世界中唯一的数字用户 ID。

SecurityIdentifier您可以使用其Value属性存储对象的字符串表示形式:

string storedSid = WindowsIdentity.Current.User.Value;

然后,您可以使用它重建 SecurityIdentifier,并在服务端进行比较:

SecurityIdentifier sid = new SecurityIdentifier(storedSid);
// SecurityIdentifer defines operator ==
bool equalUsers = sid == ServiceSecurityContext.Current.WindowsIdentity.User;
于 2012-07-27T16:48:56.797 回答