2016-06-15 3 views
0

이전에 우리의 작은 Sharepoint 환경에서 : 우리는 모든 것을 위해 통합 Windows 인증을 사용했습니다. 우리의 셰어 포인트 사이트 중 일부에는 비 셰어 포인트 WCF 서비스를 호출하는 커스텀 자바 스크립트 애플리케이션 로직이 통합되어 IIS의 윈도우 통합 인증에 의해 보안되었다. 현재 Sharepoint User의 Windows ID가 자바 스크립트 AJAX 요청과 WCF 서비스로 전달 되었기 때문에 효과가있었습니다. WCF 서비스는 ID 정보를 사용하여 일부 논리를 수행하고 호출을 반환했습니다.ADFS 환경에서 Javascript를 통해 Sharepoint 내에서 외부 ADFS 보안 WCF 서비스를 호출하는 방법은 무엇입니까?

그런 다음 windows 통합 인증이 더 이상 작동하지 않아서 javascript 응용 프로그램 코드를 위반 한 ADFS 3.0과 Sharepoint를 설정합니다. 내 질문 :이 문제를 해결할 적절한 방법은 무엇입니까? ADFS 클레임 기반 인증을 지원하기 위해 외부 WCF 서비스를 수정해야한다는 것이 확실합니다. ActiveDirectoryFederationServices BearerAuthentication을 사용하여 WCF 서비스를 .NET 웹 API로 마이그레이션하는 방법에 대해서도 생각했습니다.

하지만 자바 스크립트 측면에서 현재 로그온 한 사용자와 해당 서비스를 호출하는 방법은 무엇입니까? 나는 셰어 포인트가 현재 사용자에 관한 정보로 "FedAuth"쿠키를 보관하고 있음을 이해합니다. 외부 웹 서비스에 해당 토큰을 사용할 수 있습니까? 어떤 도움을 주셔서 감사합니다.

답변

0

업데이트 : FedAuth 쿠키가 HttpOnly로 보호되고 javscript에서 액세스 할 수 없으므로이 방법은 작동하지 않습니다. 그래서 우리는 전체 아이디어를 버리고 Sharepoint에 직접 호스팅 된 프록시 웹 서비스를 만들었습니다.

그들이 FedAuth 쿠키를 만드는 곳에 우리는 특히 시점에서 셰어 STS의 소스 코드를 보았다 :

이것은 우리가 그것을 해결하는 방법입니다 ... 노력이 같은데,하지만 못생긴 토큰에 대한 서명을 만듭니다. 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 쿠키의 값을 확인할 수 있습니다. 물론 Sharepoint가 Token Service에 사용하는 것과 동일한 인증서를 가져야합니다 (예 : MMC를 통해 인증서 추출).

이제 우리는 자바 스크립트를 통해 WCF 서비스를 호출하고 사용자의 현재 FedAuth 쿠키에서 값을 전달하고 쿠키의 서명을 확인하여 사용자의 신원을 확인할 수 있습니다. 그런 다음 응용 프로그램 논리에서 쿠키의 UserKey/UserName 값을 사용하여 안전하게 작업 할 수 있습니다.