Pergunta

Eu tenho um requisito para poder sempre obter o usuário logado.

O objeto pelo qual o processo de chamada passará é o spweb.

Como este é um código legado, não posso alterar o que os processos de chamada enviam, e aqui está o problema:Alguns deles passam o SPWeb rodando como está, e alguns enviam um SPWeb com privilégios elevados.Para os privilégios elevados, o usuário logado é retornado como System.

Em ambos os casos, quero obter o usuário logado no momento.

Tudo isso é possível?

Foi útil?

Solução

Você tem duas situações possíveis aqui.

case A: Você está fora do escopo de execução de privilégios de execução Você pode estar recebendo uma instância elevada do SPWEB que foi salva fora do escopo do delegado de execução do RunWithelevatedPrivilegs. Este é um horror de código na maioria dos casos, mas ainda é possível. Nesse caso, recriando uma nova instância com base na URL do elevado seria suficiente: a nova instância não será elevada, para que você possa obter o usuário de lá.

case b: o seu método é chamado dentro de uma execução de execução de execução Neste caso, recriando a instância do SPWeb não fará nada de bom. Qualquer nova instância ainda seria elevada, então esta é uma vez. Para escapar dessa situação, você precisa encontrar uma instância que foi criada fora do escopo de elevação. Como? Ao explorar o seu contexto de execução: Por exemplo, em um receptor de evento de recurso, você pode acessar a instância da Web nas propriedades do evento, etc, já que você está em um método personalizado e não pode alterar os parâmetros recebidos, você precisa acessar algum tipo de contexto. Você poderia recorrer ao spcontext.current.web? Essa instância não é elevada, então o usuário deve ser o atual navegando no site. Dito isto, você pode estar em uma situação em que o contexto é inválido / nulo, caso em que AFAIK não há como obter o usuário original da instância elevada: você precisará armazená-lo em algum lugar (dica: um singleton estático?) antes de entrar no contexto de elevação.


editar

O que fazer se o seu método for chamado dentro de um delegado de execução de privilégios de execução, mas você não tem certeza de ter um SPContext válido? Este é apenas um palpite muito selvagem, mas vamos pensar nisso. RunwithelevatedPrivilges reverterá para a identidade do pool de aplicativos, certo? Se não houver um pool de aplicativos, significaria que não há identidade do conjunto de aplicativos, portanto, o usuário atual do lado de fora e dentro do delegado deve ser o mesmo. Se houver um pool de aplicativos, a maior parte do tempo você terá um SpContex, que é deselevado pela definição. Há também algum caso específico em que você executa em empregos temporizadores e tal e o contexto é nulo: nesse caso, eu acredito que você está usando a identidade do pool de aplicativos de qualquer maneira, então novamente, executado com elevado sem efeito.

Com base nisso parece que sua melhor aposta é usar o usuário do SpContex quando possível, e assumir o usuário elevado e deselevinado para ser o mesmo quando o contexto é nulo. Tome isso com um grão de sal embora ...

Outras dicas

como fazio afirmou que o desenvolvedor original que fez o código atrasado deveria usar representação para passar o objeto SPweb, mas no seu caso não, você não pode!

elevar significa que seu objeto SPWeb é elevado para o usuário do sistema e retornará esse usuário independentemente até que o objeto spweb seja descartado!

SPUser loggedinUser = SPContext.Current.Web.CurrentUser;

o código acima funcionaria se estivesse fora do objeto SPWeb elevado, mas se estivesse dentro do bloco elevado, infelizmente retornaria a conta do sistema!

Pode postar algum código?ou nos dê mais informações sobre onde você usará o objeto SPWeb que é passado?talvez você possa usar o código acima no objeto SPWeb aberto atual e, em seguida, definir o objeto SPWeb como o objeto elevado?

mas a resposta curta é não, você não pode obter o usuário logado real de um usuário elevado!

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