以前在我们的小Sharepoint环境中:我们对所有内容使用了集成的Windows身份验证。在我们的一些sharepoint站点上,我们集成了一些调用非Sharepoint WCF服务的自定义javascript应用程序逻辑,该服务也通过IIS中的Windows集成身份验证进行保护。它只是起作用,因为当前Sharepoint用户的Windows身份传递给了javascript AJAX请求并传递给了WCF服务。 WCF服务使用身份信息执行某些逻辑并返回呼叫。
然后我们使用ADFS 3.0设置了Sharepoint,这打破了我们的javascript应用程序代码,因为windows集成的auth不再有效。我的问题:解决这个问题的正确方法是什么?很明显,我们必须修改外部WCF服务以支持基于身份验证的ADFS声明。我们甚至考虑过使用ActiveDirectoryFederationServices BearerAuthentication将WCF服务迁移到.NET web api。
但是在javascript方面,如何使用当前登录的用户调用该服务?据我所知,Sharepoint正在保留一个“FedAuth”cookie,其中包含有关当前用户的信息。我可以将该令牌用于外部Web服务吗?任何帮助表示赞赏。
答案 0 :(得分:0)
更新:由于FedAuth cookie受到HttpOnly保护且无法在javscript中访问,因此无效。所以我们抛弃了整个想法并创建了一个直接托管在Sharepoint中的代理Web服务。看起来这样有效,但很难看......
这就是我们解决它的方式:
我们查看了Sharepoint STS的源代码,特别是在他们创建FedAuth cookie并为令牌创建签名时。您可以在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值。