更新:由於FedAuth cookie僅受HttpOnly保護,無法在javscript中訪問,因此無法使用。所以我們拋棄了整個想法,並創建了直接在Sharepoint中託管的代理Web服務。看起來這是工作,但它是醜陋...
這就是我們如何解決它:
看着我們的SharePoint STS的源代碼,特別是在點,他們創造FedAuth餅乾和爲令牌創建簽名。您可以在dll Microsoft.Sharepoint.IdentityModel的SPSessionSecurityTokenCookieValue類中找到它。
//excerpt from the ValidateSignature method
RSACryptoServiceProvider key = (RSACryptoServiceProvider) SPSecurityTokenServiceManager.Local.LocalLoginProvider.SigningCertificate.PublicKey.Key;
CspParameters parameters = new CspParameters {
ProviderType = 0x18,
KeyNumber = (int) key.CspKeyContainerInfo.KeyNumber
};
if (key.CspKeyContainerInfo.MachineKeyStore)
{
parameters.Flags = CspProviderFlags.UseMachineKeyStore;
}
using (RSACryptoServiceProvider provider2 = new RSACryptoServiceProvider(0x800, parameters))
{
provider2.ImportCspBlob(key.ExportCspBlob(false));
string s = this.BuildValueToSign(options);
byte[] buffer = Convert.FromBase64String(signature);
flag = provider2.VerifyData(this.m_EncodingScheme.GetBytes(s), this.m_SigningScheme, buffer);
}
我們在我們的WCF服務中複製了此方法,現在可以驗證FedAuth cookie的值。當然,您需要具有Sharepoint用於其令牌服務(例如,通過MMC提取它)的相同證書。
現在我們可以通過javascript調用WCF服務,傳遞用戶當前FedAuth cookie的值,並通過驗證cookie的簽名來確認用戶的身份。然後,我們可以安全地使用我們的應用程序邏輯中的Cookie的UserKey/UserName值。