Реализация безопасности на пользовательском классе BCS / .NET?

StackOverflow https://stackoverflow.com/questions/2596534

  •  25-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

Получил ответ здесь. Отказ Я могу установить поле в модели 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, как только я перевел пользователей между Backend System и Active Directory.

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

Другие советы

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

Аутентификация вашей внешней системе

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

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

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

Проверить http://jsiegmund.wordpress.com/2010/05/19/creating-secured-bcs-bounds-with-bcs-meta-man/.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top