2012-07-27 54 views
1

我目前正在使用Windows身份驗證檢查帶有wcf服務和通過tcp連接到它的客戶端應用程序的系統。比較服務器上的WindowsIdentity.Current.Name

在某些操作中,需要將用戶名存儲在對象屬性上,將其發送到服務並將其與從客戶端傳遞的憑據進行比較。該對象被進一步處理。

客戶最近發現,這不總是按預期工作。我研究了這個問題,發現有些情況下,在客戶端和服務器端使用不同的用戶名(它在大寫和小寫的用法上有所不同)。

我已經安裝了一個解決方法(顯然在string.Equals中使用了IgnoreCase選項),但是我對真正的修復感興趣。

在客戶端上,它使用WindowsIdentity.Current.Name作爲字符串,在服務端使用ServiceSecurityContext.Current.WindowsIdentity.Name作爲字符串。

做這種比較的正確方法是什麼?

回答

0

客戶端和服務器是否在同一個域上?如果是這樣,請存儲並比較WindowsIdentity對象上的User屬性,而不是用戶名。這是用戶的安全標識符(SID),它是(簡化)Windows世界中唯一的數字用戶ID。

可以使用其Value屬性存儲SecurityIdentifier對象的字符串表示:

string storedSid = WindowsIdentity.Current.User.Value; 

然後,您可以使用該重建的SecurityIdentifier,並在服務端比較:

SecurityIdentifier sid = new SecurityIdentifier(storedSid); 
// SecurityIdentifer defines operator == 
bool equalUsers = sid == ServiceSecurityContext.Current.WindowsIdentity.User;