2016-06-15 49 views
0

以前在我們的小Sharepoint環境:我們使用集成的Windows身份驗證的一切。在我們的一些SharePoint站點上,我們集成了一些調用非Sharepoint WCF服務的自定義JavaScript應用程序邏輯,該服務也通過IIS中的Windows集成身份驗證進行了保護。它只是工作,因爲當前Sharepoint用戶的Windows身份傳遞給JavaScript AJAX請求並傳遞給WCF服務。 WCF服務使用身份信息執行一些邏輯並返回該呼叫。如何在ADFS環境中通過Javascript調用外部ADFS保護SharePoint內的WCF服務?

然後,我們使用ADFS 3.0創建了Sharepoint,它打破了我們的JavaScript應用程序代碼,因爲Windows集成身份驗證不再有效。我的問題:解決這個問題的正確方法是什麼?很明顯,我們必須修改外部WCF服務以支持基於ADFS聲明的身份驗證。我們甚至想過使用ActiveDirectoryFederationServices BearerAuthentication將WCF服務遷移到.NET web api。

但在JavaScript方面,如何用當前登錄用戶調用該服務?我知道Sharepoint正在保留一個「FedAuth」cookie,並提供有關當前用戶的信息。我可以將該令牌用於外部Web服務嗎?任何幫助表示讚賞。

回答

0

更新:由於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值。