Alguns formulários devolverão um erro de origem de dados quando a autenticação baseada em formulários está activada

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 2619846
Sintomas
Considere o seguinte cenário. Tem um site SharePoint que utiliza a autenticação baseada em formulários. Criar um modelo do InfoPath preparados para browser que chame o método GetUserProfileByName do serviço web UserProfileService do SharePoint. Tente abrir o formulário no browser. Quando o formulário faz uma chamada para essa ligação de dados neste cenário, recebe uma das seguintes mensagens de erro:
Ocorreu um erro ao consultar uma origem de dados

Ocorreu um erro ao tentar ligar a um serviço web
Foi adicionada uma entrada no registo de eventos do Windows do serviço 5566 do ID do registo

Ocorreu um erro ao aceder a uma origem de dados

Ocorreu um erro ao tentar ligar a um serviço web
Foi adicionada uma entrada no registo de eventos do Windows do serviço 5566 do ID do registo
Causa
Para um site utilizar autenticação baseada em formulários, acesso anónimo tem de ser activado ao nível da aplicação web no Internet Information Services uma vez que os utilizadores não autenticados devem poder atingir a página de início de sessão iniciar sessão. No entanto, se permitir o acesso anónimo para a aplicação web, isto impede que os serviços de formulários com êxito ao consultar o serviço de web de perfis de utilizador.

Para segurança de dados, o serviço da web UserProfileService requer o autor da chamada ser autenticado antes que o serviço irá devolver quaisquer dados. Isto ocorre porque o serviço da web UserProfileService devolve informações de identificação pessoal que são consideradas sensível à maior parte das organizações. Acesso anónimo a estes dados, normalmente, é classificado como uma violação de segurança. Uma vez que o serviço web de UserProfileService tem sem interface do utilizador para pedir um nome de utilizador e uma palavra-passe, o serviço web rejeita um pedido anónimo.

No cenário descrito em "Sintomas", este problema ocorre quando tenta Forms Services chamar o método GetUserProfileByName de UserProfileService do SharePoint. Serviços de formulários efectua a chamada anonimamente, que é a Convenção para todos os web chamadas. Se não for permitido o acesso anónimo na aplicação web, o servidor de SharePoint devolve um erro de autenticação (código 401). O servidor que a resposta indica quais os métodos de autenticação suporta. Serviços de formulários, em seguida, reenvia o pedido, incluindo as informações de autenticação pedido.

Quando o acesso anónimo está activado para a aplicação web, o pedido anónimo é aceite pela aplicação web e é passado para o serviço da web UserProfileService. O serviço web rejeita o pedido porque o pedido não está associado um utilizador válido. Serviços de formulários, em seguida, devolve um erro de servidor (código 500), que indica uma falha interna. Serviços de formulários não é possível saber que ocorreu a falha devido a um problema de autenticação. Por conseguinte, não pode devolver um erro mais específico.

Resolução
Não existe nenhuma alteração de configuração que irá resolver este problema enquanto lhe permite manter um ambiente de autenticação baseada em formulários. No entanto, pode escrever código gerido que obtém o nome de utilizador ou outras informações de utilizador e pode utilizar esse código gerido do modelo de formulário.

É o caso mais fácil obter o nome de início de sessão do utilizador actual. Pode obter este quando o formulário é carregado, adicionando uma chamada para a propriedade Application.User.LoginName para o evento FormEvents_Loading . Eis um exemplo:

        public void FormEvents_Loading(object sender, LoadingEventArgs e)        {            XPathNavigator codeUserNameXPN = this.CreateNavigator().SelectSingleNode(                "/my:myFields/my:CodeRetrievedUserName", this.NamespaceManager);            codeUserNameXPN.SetValue(this.Application.User.LoginName);        }
Se necessitar de mais informações do perfil, tem de utilizar código gerido para pré-autenticação e, em seguida, chamar directamente o serviço de web de perfis de utilizador. Isto requer a codificar ou pedir credenciais de um utilizador que tenha direitos para visualizar o perfil de utilizador indicado. Na maioria dos casos, este utilizador será um administrador do site. Se optar por codificar as credenciais, deverá considerar a segurança e problemas de manutenção. O código será executado no servidor, que pode ajudar a limitar a exposição de segurança. Mas quando o nome de utilizador ou as alterações de palavra-passe, tem de ter de actualizar o código. Pedir credenciais não apresentam estes problemas, mas só funcionará se o utilizador do formulário tem os direitos para ver o perfil de utilizador indicado.

Eis um exemplo de código que obtém as propriedades do utilizador actual:

        public void FormEvents_Loading(object sender, LoadingEventArgs e)        {            //A place to write the results            XPathNavigator codeUserNameXPN = this.CreateNavigator().SelectSingleNode(                "/my:myFields/my:CodeRetrievedUserName", this.NamespaceManager);            //codeUserNameXPN.SetValue(this.Application.User.LoginName);             try            {                //TailSpinToysAuthentication is the web service reference to the                 //https://tailspintoys:23456/_vti_bin/authentication.asmx web service                GetUserName.TailSpinToysAuthentication.Authentication authenticationWS =                    new GetUserName.TailSpinToysAuthentication.Authentication();                                //Call the web service's Login method and pass the username and password of a site                //administrator so we have rights to read all user profiles                authenticationWS.Url = "https://tailspintoys:23456/_vti_bin/authentication.asmx";                authenticationWS.CookieContainer = new System.Net.CookieContainer();                GetUserName.TailSpinToysAuthentication.LoginResult result = authenticationWS.Login(                    "Admin", "Password");                 if (result.ErrorCode == GetUserName.TailSpinToysAuthentication.LoginErrorCode.NoError)                {                    //If we authenticated correctly, then set up a call to the user profile service                    //TailSpinToysUserProfileService is the web service reference to the                     //https://tailspintoys:23456/_vti_bin/userprofileservice.asmx web service                    GetUserName.TailSpinToysUserProfileService.UserProfileService userProfileWS =                        new GetUserName.TailSpinToysUserProfileService.UserProfileService();                                        //Pass the authentication cookies we got back from the authentication web service                    userProfileWS.Url = "https://tailspintoys:23456/_vti_bin/userprofileservice.asmx";                    userProfileWS.CookieContainer = authenticationWS.CookieContainer;                     //Try to find the user profile information of the current                    GetUserName.TailSpinToysUserProfileService.PropertyData[] resultData =                        userProfileWS.GetUserProfileByName(this.Application.User.LoginName);                     //Enumerate through the properties                    foreach (GetUserName.TailSpinToysUserProfileService.PropertyData property in resultData)                    {                        //Pick out the "AccountName" property and display it                        if (property.Name == "AccountName")                            codeUserNameXPN.SetValue(property.Values[0].Value.ToString());                    }                }                else                {                    //If we failed to authenticate properly, display the reason why                    codeUserNameXPN.SetValue(result.ErrorCode.ToString());                }            }            catch (System.Exception ex)            {                //If an exception occurred, report it.                codeUserNameXPN.SetValue(ex.Message);            }        }

Nota Para utilizar o código gerido num modelo de formulário, tem de tornar o modelo de formulário totalmente fidedignos na secção de segurança das Opçõesde formulário e, em seguida, publicar o modelo de formulário no SharePoint como um modelo de formulário aprovados pelo administrador.
Ocorreu um erro ao tentar ligar a um serviço web

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 2619846 - Última Revisão: 10/29/2015 01:01:00 - Revisão: 2.0

Microsoft InfoPath 2010, Microsoft Office InfoPath 2007, InfoPath Forms Services in SharePoint 2010, Microsoft Office Forms Server 2007

  • kbmt KB2619846 KbMtpt
Comentários