我实现自定义BCS模型从后端系统中获取数据。作为后端使用它自己的用户管理,我访问它通过一个服务帐户。

这一切运作良好,并让我拉的数据到SharePoint。然而,因为它通过服务帐户渠道,每个人都可以访问它,这是不好的。

任何人都可以给我一些提示哪种方法来实现?后端不给我NT的ACL,但我有点不知道如果我可以只“假”呢? (本质上说,“这NT组具有读取访问”是不够好)。

我的搜索结果知道ISecurityTrimmer2的,但最好我想盖安全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;
}

这工作得很好,让我一次,我的后台系统和Active Directory之间转换的用户创建自定义的访问控制列表。

我仍然有兴趣听到的话,有人如果有安全为BCS模型的一部分的另一种方式。

其他提示

如果你想避免安全存储,这听起来像你唯一的选择是直通。美中不足的是,你不能使用NTLM。您必须使用Kerberos,因为NTLM不允许身份代表团,因为您将凭据传递从用户到SharePoint服务器到外部系统。在使用Kerberos身份委派,您需要为您的服务创建一个SPN(服务主体名称),这样AD知道它被允许委派的身份。

鉴定到你的外部系统

请参阅使用Web应用程序创建服务主体名称Kerberos身份验证本文用于创建SPN英寸

我使用有所不同的方法。如果你的代码.NET对象从您的外部系统检索数据,您可以访问SPContext对象来检查你访问哪个网站,或用户查询数据。在代码中,你可以使用这些信息来过滤任何你喜欢的是什么数据。

所以外部列表对您的SharePoint站点完全相同的情况下可能会返回5个结果的使用的,但10个结果用户B基于用户名或者是组成员。并不难实现和实际工作相当不错。

查核 http://jsiegmund.wordpress.com/2010/05/19/creating-secured-bcs-objects-with-bcs-meta-man/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top