2010-04-07 25 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/