自定义BCS / .NET类实现安全性?
-
25-09-2019 - |
题
我实现自定义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/ 。