我正在实现自定义BCS模型以从后端系统获取数据。由于后端使用自己的用户管理,我通过服务帐户访问它。
所有这些都运行良好,并允许我将数据提取到SharePoint。但是因为它是通过服务帐户引导的,所以每个人都可以访问它,这很糟糕。
任何人都可以给我一些方法来实现吗?后端没有给我NT ACL,但我想知道我是否可以以某种方式“伪造”它们? (基本上说“这个NT组具有读取权限”已经足够了)。
我知道搜索结果的ISecurityTrimmer2,但理想情况下我想要涵盖BCS模型中的安全性,以便它也适用于外部列表。我想避免使用安全存储并将每个用户映射到后端。
答案 0 :(得分:2)
得到答案here。我可以将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模型的一部分,我仍然有兴趣听听是否有人采用其他方式。
答案 1 :(得分:0)
如果你想避免使用Secure Store,听起来你唯一的选择就是PassThrough。问题是您无法使用NTLM。您必须使用Kerberos,因为NTLM不允许身份委派,因为您将凭据从用户传递到SharePoint服务器到外部系统。在使用Kerberos进行身份委派时,您需要为服务创建一个SPN(服务主体名称),以便AD知道允许委派身份。
Authenticating to Your External System
请参阅本文中的Create Service Principal Names for your Web applications using Kerberos authentication以了解如何创建SPN。
答案 2 :(得分:0)
我使用的方法有所不同。如果编写.NET对象以从外部系统检索数据,则可以访问SPContext对象以检查您所在的站点或哪个用户正在查询数据。在代码中,您可以使用该信息按照您喜欢的方式过滤数据。
因此,SharePoint网站上的外部列表的完全相同的实例可能会返回5个结果以供使用A,但是根据用户名或组成员身份返回10个结果。实现起来并不是很难实现。
查看http://jsiegmund.wordpress.com/2010/05/19/creating-secured-bcs-objects-with-bcs-meta-man/。