Pergunta

Estou implementando um modelo BCS personalizado para obter dados de um sistema de back -end. Como o back -end usa seu próprio gerenciamento de usuários, estou acessando -o por meio de uma conta de serviço.

Tudo isso funciona bem e me permite puxar dados para o SharePoint. No entanto, como é canalizada pela conta de serviço, todos podem acessá -la, o que é ruim.

Alguém pode me dar algumas dicas qual método para implementar? O back -end não me dá ACLs, mas eu me pergunto se poderia simplesmente "fingir" de alguma forma? (Dizer essencialmente "este grupo NT tem acesso de leitura" é bom o suficiente).

Estou ciente do ISecurityTrimmer2 para obter resultados de pesquisa, mas, idealmente, quero cobrir a segurança dentro do modelo BCS, para que ele se aplique a listas externas também. Quero evitar o uso de armazenamento seguro e mapear cada usuário individual para o back -end.

Foi útil?

Solução

Recebi uma resposta aqui. Eu posso definir um campo no modelo BCS como o WindowsSecurityDescriptorfield e, em seguida, posso usar o código personalizado nos meus métodos BCS para criar um 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;
}

Isso funciona bem e me permite criar ACLs personalizados assim que traduzi usuários entre o sistema de back -end e o Active Directory.

Ainda estou interessado em saber se alguém tem outra maneira se tiver segurança como parte do modelo BCS.

Outras dicas

Se você deseja evitar o Secure Store, parece que sua única opção é a repasse. A captura é que você não pode usar o NTLM. Você deve usar o Kerberos porque o NTLM não permite a delegação de identidade, pois está passando credenciais do usuário para o servidor do SharePoint para o sistema externo. Ao usar o Kerberos para delegação de identidade, você precisa criar um SPN (nome do princípio do serviço) para o seu serviço, para que o anúncio saiba que ele pode delegar identidades.

Autentação do seu sistema externo

Ver Crie nomes principais de serviço para seus aplicativos da Web usando a autenticação Kerberos Neste artigo, para criar um SPN.

Estou usando uma abordagem um pouco diferente. Se você codificar objetos .NET para recuperar os dados do seu sistema externo, poderá acessar o objeto SPContext para verificar em qual site você está ou qual usuário está consultando os dados. No código, você pode usar essas informações para filtrar os dados do que quiser.

Portanto, a mesma instância de uma lista externa no site do SharePoint pode retornar 5 resultados para uso A, mas 10 resultados para o usuário B com base no nome de usuário ou talvez na associação ao grupo. Não é tão difícil de implementar e realmente funciona muito bem.

Verificação de saída http://jsiegmund.wordpress.com/2010/05/19/creating-segus-bcs-objects-with-bcs-seta-man/.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top