Реализация безопасности на пользовательском классе BCS / .net? - PullRequest
4 голосов
/ 08 апреля 2010

Я реализую пользовательскую модель BCS для получения данных из бэкэнд-системы. Поскольку бэкэнд использует собственное управление пользователями, я обращаюсь к нему через служебную учетную запись.

Все это хорошо работает и позволяет извлекать данные в SharePoint. Однако, поскольку он направляется через служебную учетную запись, каждый может получить к нему доступ, что плохо.

Может кто-нибудь дать мне несколько советов, какой метод реализовать? Бэкэнд не дает мне NT ACL, но мне интересно, могу ли я как-то просто "подделать" их? (По сути, достаточно сказать, что «эта группа NT имеет доступ для чтения»).

Мне известен ISecurityTrimmer2 для результатов поиска, но в идеале я хочу охватить безопасность внутри модели BCS, чтобы она также применялась к внешним спискам. Я хочу избежать использования безопасного хранения и привязки каждого отдельного пользователя к бэкэнду.

Ответы [ 3 ]

2 голосов
/ 18 апреля 2010

Получил ответ здесь . Я могу установить поле в модели BCS как WindowsSecurityDescriptorField, а затем использовать собственные методы в моих методах BCS для создания списков ACL:

Byte[] GetSecurityDescriptor(string domain, string username)
{
    NTAccount acc = new NTAccount(domain, username);
    var sid = (SecurityIdentifier)acc.Translate(typeof(SecurityIdentifier));
    CommonSecurityDescriptor sd = new CommonSecurityDescriptor(false, false,
        ControlFlags.None,sid,null, null, null);
    sd.SetDiscretionaryAclProtection(true, false);

    //Deny access to everyone
    SecurityIdentifier everyone = new SecurityIdentifier(
        WellKnownSidType.WorldSid, null);
    sd.DiscretionaryAcl.RemoveAccess(AccessControlType.Allow, everyone, 
      unchecked((int)0xffffffffL), InheritanceFlags.None, PropagationFlags.None);

    //Grant full access to specified user
    sd.DiscretionaryAcl.AddAccess(AccessControlType.Allow, sid,
      unchecked((int)0xffffffffL), InheritanceFlags.None, PropagationFlags.None);

    byte[] secDes = new Byte[sd.BinaryLength];
    sd.GetBinaryForm(secDes, 0);

    return secDes;
}

Это хорошо работает и позволяет мне создавать пользовательские списки ACL после перевода пользователей между серверной системой и Active Directory.

Мне все еще интересно узнать, есть ли у кого-то другой путь, если есть защита как часть модели BCS.

0 голосов
/ 12 августа 2010

Я использую несколько иной подход.Если вы кодируете объекты .NET для извлечения данных из вашей внешней системы, вы можете получить доступ к объекту SPContext, чтобы проверить, на каком сайте вы находитесь или какой пользователь запрашивает данные.В коде вы можете использовать эту информацию для фильтрации данных по своему вкусу.

Таким образом, один и тот же экземпляр внешнего списка на вашем сайте SharePoint может вернуть 5 результатов для использования A, но 10 результатов для пользователя B на основе имени пользователя или, возможно, членства в группе.Не так сложно реализовать и на самом деле работает довольно хорошо.

Выезд http://jsiegmund.wordpress.com/2010/05/19/creating-secured-bcs-objects-with-bcs-meta-man/.

0 голосов
/ 18 апреля 2010

Если вы хотите избежать Secure Store, похоже, ваш единственный выбор - PassThrough.Подвох в том, что вы не можете использовать NTLM.Вы должны использовать Kerberos, потому что NTLM не позволяет делегировать удостоверения, так как вы передаете учетные данные от пользователя на сервер SharePoint во внешнюю систему.При использовании Kerberos для делегирования удостоверений вам необходимо создать SPN (имя принципа службы) для вашей службы, чтобы AD знал, что ему разрешено делегировать удостоверения.

См. Создание имен участников службы для ваших веб-приложений с использованием аутентификации Kerberos в этой статье для создания имени участника-службы.

...