2010-04-07 27 views
4

我正在实现一个自定义的BCS模型来从后端系统获取数据。由于后端使用它自己的用户管理,我通过服务帐户访问它。在自定义BCS/.net类上实现安全性?

所有这一切运作良好,并允许我将数据拉入SharePoint。但是,因为它是通过服务帐户传送的,所以每个人都可以访问它,这很糟糕。

任何人都可以给我一些提示哪些方法来实现?后端不给我NT ACL,但我想知道我能否以某种方式“伪造”它们? (基本上说“这个NT组有阅读权限”就足够了)。

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

+0

忽然想知道bcs ... – 2010-04-12 17:59:37

回答

2

得到了答案here。我可以在BCS模式设置字段是WindowsSecurityDescriptorField,然后我可以使用自定义代码在我的BCS方法来创建一个访问控制列表:

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在后端系统和Active Directory之间。

我仍然有兴趣听到如果某人如果将安全性作为BCS模型的一部分有其他方式。

0

如果你想避免安全存储,这听起来像你唯一的选择是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英寸

+0

Pass-Thru没有帮助,因为后端系统不知道Windows用户的任何信息,所以它拥有自己的数据库。我知道如何在.NET代码中将外部用户映射到Windows用户,这是导致BCS导致问题的原因。 – 2010-04-18 03:35:15

+0

@Michael Stum - 如果是这样,我认为唯一的另一种方式是使用Secure Store。尽管在第一个链接中提到了用于存储二级认证凭证的解决方案。但是这确实需要使用Secure Store。 – Thomas 2010-04-18 04:27:45

0

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

因此,SharePoint网站上的外部列表完全相同的实例可能会返回5个结果以供使用A,但10个结果基于用户名或可能是组成员资格。实现起来并不困难,而且实际上工作很好。

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