Веб-сервис обычно MDS настраивается при включенной имперсонализации, и метод аутентификации - windows. Однако из SharePoint вызов кода веб-сервиса происходит от имени IUSR. Чтобы заставить веб-сервис выполняться от имени той учетной записи, под которой пользователь зашел на SharePoint необходимо сделать следующие 2 вещи:
1. Включить службу Claims To Windows Token Service
2. В коде сделать логон под требуемой учеткой.
Служба стартуется из Центра администрирования SharePoint 2013
System Settings -> Manage Services on server -> Claims To Windows Token Service -> Start
Далее необходимо добавить в проект утилиту (взято отсюда)
1. Включить службу Claims To Windows Token Service
2. В коде сделать логон под требуемой учеткой.
Служба стартуется из Центра администрирования SharePoint 2013
System Settings -> Manage Services on server -> Claims To Windows Token Service -> Start
Далее необходимо добавить в проект утилиту (взято отсюда)
public class Utility { public static WindowsIdentity GetWindowsIdentityFromClaimsToken() { WindowsIdentity wi = null; // Run this portion of code as application pool account, so that C2WTS service is called as this account SPSecurity.RunWithElevatedPrivileges(delegate() { // Get the UPN value of the user from the UPN claim type Microsoft.IdentityModel.Claims.IClaimsIdentity identity = ((Microsoft.IdentityModel.Claims.ClaimsIdentity)Thread.CurrentPrincipal.Identity as Microsoft.IdentityModel.Claims.IClaimsIdentity); string upn = null; foreach (Microsoft.IdentityModel.Claims.Claim claim in identity.Claims.Where(claim => StringComparer.Ordinal.Equals(ClaimTypes.Upn, claim.ClaimType))) { upn = claim.Value; } if (upn == null) { throw new Exception(string.Format("Cannot Impersonate {0} since he doesn't have a UPN in his claims", Thread.CurrentPrincipal.Identity.Name)); } // Get a WindowsIdentity from the UPN of the user by calling C2WTS service try { wi = Microsoft.IdentityModel.WindowsTokenService.S4UClient.UpnLogon(upn); } catch (System.Exception ex) { throw new Exception(string.Format("Impersonation failed. Message: {0}", ex.Message)); } }); return wi; } }
Далее можно вызывать методы веб-сервиса:
using (WindowsImpersonationContext ctxt = Utility2.GetWindowsIdentityFromClaimsToken().Impersonate()) { ServiceReference.ServiceClient = client = new ServiceReference.ServiceClient(); var resultOptions = new MetadataResultOptions(); resultOptions.Models = ResultType.Identifiers; var criteria = new MetadataSearchCriteria(); criteria.SearchOption = SearchOption.UserDefinedObjectsOnly; OperationResult result; var models = _client.MetadataGet(new International(), resultOptions, criteria, out result); }