4

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

所有这些都运行良好,并允许我将数据提取到 SharePoint。但是,因为它是通过服务帐户引导的,所以每个人都可以访问它,这很糟糕。

任何人都可以给我一些提示,使用哪种方法?后端没有给我 NT ACL,但我想知道我是否可以以某种方式“伪造”它们?(基本上说“这个 NT 组具有读取访问权限”就足够了)。

我知道用于搜索结果的 ISecurityTrimmer2,但理想情况下,我想涵盖 BCS 模型内部的安全性,以便它也适用于外部列表。我想避免使用安全存储并将每个单独的用户映射到后端。

4

3 回答 3

2

在这里得到了答案。我可以将 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 之间转换用户后创建自定义 ACL。

如果将安全性作为 BCS 模型的一部分,我仍然很想知道是否有人有其他方法。

于 2010-04-18T03:44:50.990 回答
0

如果你想避开 Secure Store,听起来你唯一的选择就是 PassThrough。问题是您不能使用 NTLM。您必须使用 Kerberos,因为 NTLM 不允许身份委派,因为您将凭据从用户传递到 SharePoint 服务器到外部系统。在使用 Kerberos 进行身份委派时,您需要为您的服务创建一个 SPN(服务主体名称),以便 AD 知道允许委派身份。

对您的外部系统进行身份验证

请参阅本文中的使用 Kerberos 身份验证为您的 Web 应用程序创建服务主体名称以创建 SPN。

于 2010-04-18T03:29:56.027 回答
0

我正在使用一种不同的方法。如果您对 .NET 对象进行编码以从外部系统检索数据,则可以访问 SPContext 对象以检查您所在的站点或正在查询数据的用户。在代码中,您可以使用该信息来过滤任何您喜欢的数据。

因此,SharePoint 网站上完全相同的外部列表实例可能会为用户 A 返回 5 个结果,但根据用户名或组成员身份为用户 B 返回 10 个结果。实施起来并不难,实际上效果很好。

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

于 2010-08-12T14:17:35.463 回答