2

現在、wcf サービスと、Windows 認証を使用して 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 に答える