Pergunta

Eu tenho um aplicativo ASP.NET MVC que se conecta ao SharePoint 2010 por meio do Client OM.Quando eu corro ExecuteQuery(), recebo um erro HTTP 401 do SharePoint.

Eu tenho o aplicativo MVC configurado para representar o usuário logado.

A configuração de representação em web.config (do aplicativo MVC):

<configuration>
    <system.web>
        <identity impersonate="true" />
    </system.web>
</configuration>

O código:

Client Context ctx = new ClientContext("http://sharepoint.company.com/site");
ctx.Credentials = CredentialCache.DefaultNetworkCredentials;

Web web = ctx.Web;
ListCollection lists = web.Lists;

ctx.Load(web);
ctx.Load(lists);

ctx.ExecuteQuery();

A exceção:

System.Net.WebException:O servidor remoto retornou um erro:(401 não autorizado.at System.Net.HttpWebRequest.GetResponse() at Microsoft.SharePoint.Client.SPWebRequestExecutor.Execute() at Microsoft.SharePoint.Client.ClientContext.EnsureFormDigest() at Microsoft.SharePoint.Client.ClientContext.ExecuteQuery() at MVCApp.Services .SharePointService.getLibraries ()

Quando removo a configuração de representação do web.config, o Cliente OM usa a conta do pool de aplicativos do aplicativo MVC para se conectar.Quando isso acontece, a conexão é bem-sucedida (após conceder permissões à conta do pool de aplicativos).Além disso, se eu codificar uma credencial de usuário em vez de usar DefaultNetworkCredentials, a conexão também funciona.

O aplicativo está configurado para autenticação do Windows e a autenticação anônima está desabilitada no IIS.

Coisas que tentamos:

  1. garantir que as contas do pool de aplicativos possam delegar permissões.
  2. configuração Kerberos verificada (removemos alguns SPNs duplicados)
  3. conecte-se a partir de um servidor diferente (estamos hospedando este aplicativo no SharePoint App Server).Conectar-se a partir deste servidor significa que não podemos nos conectar a NENHUMA instância do SharePoint.A conexão de outro servidor nos permite conectar ao nosso ambiente DEV, mas não a este servidor (QA) ou ao nosso ambiente de produção.

O que posso fazer para que o Cliente OM delegue as permissões do usuário ao se conectar ao SharePoint?


Atualizar

Curiosamente, tentei um WebRequest simples para SharePoint, com resultados idênticos, o que me diz que o problema não é causado pelo OM do Cliente:

WebRequest request = WebRequest.Create("http://xxxxxxxxx");
request.Credentials = CredentialCache.DefaultNetworkCredentials;

using(WebResponse response = request.GetResponse())
using(StreamReader reader = new StreamReader(response.GetResponseStream()))
{
    return Content(reader.ReadToEnd(), "text/html");
}
Foi útil?

Solução

Parece que você está atingindo o notório Problema de salto duplo NTLM e lamento dizer que não há outra maneira de evitar isso além de alterar sua autenticação para Claims ou Kerberos.Nenhum dos quais deve ser considerado levianamente.

Se o seu código for executado em uma das máquinas do farm do SharePoint com as quais você está tentando interagir, provavelmente você poderá contornar isso ignorando completamente o segundo 'salto' e interagindo com o SharePoint diretamente por meio do modelo de objeto no servidor, em vez de através de serviços web.

Outras dicas

Quase dois anos se passaram, mas recentemente tive o mesmo problema com o SharePoint 2013 (na verdade, acessei o SP2013 com bibliotecas CSOM do SP 2010).Finalmente consegui resolver isso.

Primeiro, presumo que a autenticação Kerberos estava funcionando corretamente no seu caso.Só por segurança, você pode desativar a autenticação NTML nas configurações do IIS ou exibi-la na sua página de teste

Thread.CurrentPrincipal.Identity.AuthenticationType

Deveria estar Negociar.Não faz sentido tentar a delegação quando você realmente faz logon com NTML, o que pode acontecer quando ambos têm permissão.

A seguir, a atualização da sua pergunta.Me ajudou muito, percebi que não devemos nos preocupar com o CSOM quando a delegação mais simples com WebRequest não funciona.O problema está aqui.

E, finalmente, esta ligação imperceptível do SJ resposta pode realmente fornecer a solução – você mencionou todas as etapas na configuração da delegação, exceto permitir a delegação para o SERVIDOR.Sim, você deve configurar que você confia ambos a conta para delegação (que você mencionou) e esta máquina específica para delegação.

E mais uma coisa bastante óbvia – o próprio SharePoint precisa ser configurado corretamente para autenticação Kerberos.

Depois que a delegação para uma solicitação da Web funcionar (por exemplo,carregando a página inicial), você pode fazer o mesmo com o CSOM.Eu testei, funciona perfeitamente.

A diferença é que (1) usei o SP2013 com o CSOM 2010, (2) ativei a delegação apenas para um fragmento específico, e não para toda a solicitação:

string ImpersonatedSpLogin = null, ImpersonatedSpMail = null;

WindowsIdentity identity = (WindowsIdentity)User.Identity;
using (var impersonationContext = identity.Impersonate())
{
    using (ClientContext context = new ClientContext("http://myServer.somewhere.com/"))
    {
        context.Load(context.Web.CurrentUser);
        context.ExecuteQuery();
        ImpersonatedSpLogin = context.Web.CurrentUser.LoginName;
        ImpersonatedSpMail = context.Web.CurrentUser.Email;
    }

    impersonationContext.Undo();
}
// now you can verify by checking  ImpersonatedSpLogin and ImpersonatedSpMail

Espero que ajude alguém.

Você tem <authentication mode="Windows" /> lá em algum lugar também?Acredito que isso também seja necessário.

O link abaixo contém algumas informações sobre a saída de algumas variáveis ​​​​com base nas definições de configuração do web.config e IIS

https://stackoverflow.com/a/1688220/1282079

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