4

バックエンドシステムからデータを取得するためにカスタムBCSモデルを実装しています。バックエンドは独自のユーザー管理を使用しているため、サービスアカウントを介してアクセスしています。

これらはすべてうまく機能し、SharePointにデータを取り込むことができます。ただし、サービスアカウントを介してチャネル化されているため、誰でもアクセスできます。これは悪いことです。

誰かが私に実装する方法のヒントを教えてもらえますか?バックエンドはNTACLを提供しませんが、どういうわけかそれらを「偽造」できるのではないかと思います。(基本的に、「この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を使用できないことです。ユーザーからSharePointサーバー、外部システムにクレデンシャルを渡すため、NTLMではIDの委任が許可されていないため、Kerberosを使用する必要があります。IDの委任にKerberosを使用する場合は、サービスのSPN(サービス原則名)を作成して、ADがIDの委任が許可されていることを認識できるようにする必要があります。

外部システムへの認証

SPNの作成については、この記事の「Kerberos認証を使用したWebアプリケーションのサービスプリンシパル名の作成」を参照してください。

于 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 に答える