Question

Je suis mise en œuvre d'un modèle BCS personnalisé pour obtenir des données à partir d'un système back-end. Comme le backend utilise propre gestion des utilisateurs de, je suis d'y accéder via un compte de service.

Tout cela fonctionne bien et me permet d'extraire des données dans SharePoint. Cependant parce qu'elle est canalisée par le compte de service, tout le monde peut y avoir accès, ce qui est mauvais.

Quelqu'un peut-il me donner quelques conseils qui méthode pour mettre en œuvre? Le back-end ne me donne pas NT ACLs, mais je me demande si je pouvais les « faux » en quelque sorte? (Essentiellement en disant « Ce groupe NT a accès en lecture » est assez bon).

Je suis au courant de ISecurityTrimmer2 pour les résultats de la recherche, mais idéalement, je veux couvrir la sécurité à l'intérieur du modèle BCS afin qu'il applique aux listes externes. Je veux éviter d'utiliser le stockage sécurisé et la cartographie chaque utilisateur au back-end.

Était-ce utile?

La solution

Vous avez une réponse . Je peux définir un champ dans le modèle BCS être le WindowsSecurityDescriptorField et je peux utiliser un code personnalisé dans mes méthodes BCS pour créer un ACLs:

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;
}

Cela fonctionne bien et me permet de créer ACLs personnalisés une fois que je traduisais les utilisateurs entre le système de back-end et Active Directory.

Je suis toujours intéressé à entendre si quelqu'un a une autre façon, si avoir la sécurité dans le cadre du modèle BCS.

Autres conseils

Si vous voulez éviter Secure Store, il semble que votre seul choix est PassThrough. Le hic est que vous ne pouvez pas utiliser NTLM. Vous devez utiliser Kerberos parce que NTLM ne permet pas de délégation d'identité puisque vous passez des informations d'identification de l'utilisateur au serveur SharePoint au système externe. En utilisant Kerberos pour la délégation d'identité, vous devez créer un SPN (nom principal de service) pour votre service afin que AD sait qu'il est permis de déléguer des identités.

Authentifier à votre système externe

Voir Créer des noms principaux pour vos applications Web en utilisant l'authentification Kerberos dans cet article pour créer un SPN.

J'utilise une approche quelque peu différente. Si vous codez des objets .NET pour récupérer les données de votre système externe, vous pouvez accéder à l'objet SPContext pour vérifier sur ce site que vous êtes, ou l'utilisateur qui interrogent les bases de données. Dans le code, vous pouvez utiliser cette information pour filtrer les données à tout ce que vous aimez.

Ainsi, la même instance exacte d'une liste externe sur votre site SharePoint pourrait revenir 5 résultats pour l'utilisation A, mais 10 résultats pour l'utilisateur B basé sur le nom d'utilisateur ou peut-être l'appartenance au groupe. Pas si difficile à mettre en œuvre et fonctionne en fait assez bonne.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top