O modelo de objeto do cliente fornece 401 ao representar o usuário logado - aplicativo MVC
-
09-12-2019 - |
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:
- garantir que as contas do pool de aplicativos possam delegar permissões.
- configuração Kerberos verificada (removemos alguns SPNs duplicados)
- 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");
}
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
O link abaixo ajuda?Também estou enfrentando um problema semelhante.