Home > SharePoint - Tips & Tricks > The security validation for this page is invalid and might be corrupted. Please use your web browser’s Back button to try your operation again

The security validation for this page is invalid and might be corrupted. Please use your web browser’s Back button to try your operation again


Cenário:

Estou simulando um “stress test” no meu ambiente de desenvolvimento para simular o impacto (hardware) de algumas operações do SharePoint 2013.

No meu teste, além de navegar e buscar alguns itens no site, também quero que o “robô” crie itens nas listas do SharePoint através de requests HTTP.

Ao tentar criar itens usando uma chamada HTTP com as APIs do SharePoint temos o erro mencionado a seguir.

ERRO:

The security validation for this page is invalid and might be corrupted. Please use your web browser’s Back button to try your operation again

Ou, PT-BR:

A validação de segurança para esta página não é valida e pode estar corrompida. Use o botão Voltar do navegador Web para tentar realizar a operação novamente.

SOLUÇÃO:

Como não estou usando OAuth para autorizar a requisição, precisamos passar um “digest value” válido no Header da requisição.

Conseguimos pegar esse valor em um campo (__REQUESTDIGEST) escondido da MasterPage padrão do SharePoint:

 

<input type="hidden" name="__REQUESTDIGEST" id="__REQUESTDIGEST" value="0xC756DFF038FC6A0D241D7203952F8545BC495084B8DCD4EB0171E88F15DD633F8590
ADE4C8749EDCDA73A9C48C8C8C8B515929E86CBBA83341187B3791F20F71,19 Oct 2015 18:14:37 -0000
" />

 

Ou fazendo uma chamada POST com o “body” vazio para http://<site url>/_api/contextinfo antes da chamada que irá criar o item. O retorno dessa chamada conseguimos pegar o “digest value”.

No “Header” dessa chamada com “body” vazio, passe o parâmetro “Accept” com valor “application/json;odata=verbose”.

Exemplo da chamada ao contextinfo:

image

Resposta do contextinfo:

image

{"d":{"GetContextWebInformation":{"__metadata":{"type":"SP.ContextWebInformation"},"FormDigestTimeoutSeconds":1800,"FormDigestValue":
"0xC756DFF038FC6A0D241D7203952F8545BC495084B8DCD4EB0171E88F15DD633F8
590ADE4C8749EDCDA73A9C48C8C8C8B515929E86CBBA83341187B3791F20F71,19 Oct 2015 18:14:37 -0000
"
,"LibraryVersion":"15.0.4569.1000","SiteFullUrl":http://vmsp2013,
"SupportedSchemaVersions":{"__metadata":{"type":"Collection(Edm.String)"},"results":["14.0.0.0","15.0.0.0"]},"WebFullUrl":"http://vmsp2013&quot;}}}

O valor em realce é o valor do parâmetro “X-RequestDigest” que precisamos passar no “Header” da requisição que irá criar itens na lista do SharePoint.

Exemplo da requisição que cria itens em uma lista do SharePont 2013:

POST http://vmsp2013/_vti_bin/client.svc/ProcessQuery

POST data:

<Request xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009&quot; SchemaVersion="15.0.0.0" LibraryVersion="15.0.0.0" ApplicationName="Javascript Library"><Actions>TitleTestefalseIdade22falseContentTypeItemfalseContentTypeId0x01000DC117894911AA4BB7ADE719F7B6C168false</Parameter><Parameter Type="Boolean">false</Parameter><Parameter Type="Null" /></Parameters></Method></ExceptionHandlingScopeSimple></Actions>
<ObjectPaths><StaticProperty Id="0" TypeId="{3747adcd-a3c3-41b9-bfab-4a64dd2f1e0a}" Name="Current" /><Property Id="2" ParentId="0" Name="Web" /><Property Id="4" ParentId="2" Name="Lists" /><Method Id="6" ParentId="4" Name="GetById"><Parameters><Parameter Type="String">84dbf580-a818-4904-a726-25fedc09e490</Parameter></Parameters></Method><Method Id="8" ParentId="6" Name="AddItem"><Parameters><Parameter TypeId="{54cdbee5-0897-44ac-829f-411557fa11be}"><Property Name="FolderUrl" Type="String">/Lists/TesteJMeter</Property><Property Name="LeafName" Type="Null" /><Property Name="UnderlyingObjectType" Type="Number">0</Property></Parameter></Parameters></Method></ObjectPaths>
</Request>

[no cookies]

Request Headers:

Cache-Control: no-cache

X-Requested-With: XMLHttpRequest

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

User-Agent: Mozilla/5.0 (Windows NT 6.3; rv:38.0) Gecko/20100101 Firefox/38.0

Referer: http://vmsp2013/Lists/TesteJMeter/NewForm.aspx?Source=http%3A%2F%2Fvmsp2013%2FLists%2FTesteJMeter%2FAllItems%2Easpx&RootFolder=

X-RequestDigest: 0xC756DFF038FC6A0D241D7203952F8545BC495084B8DCD4EB0171E88F15DD633F8590ADE4
C8749EDCDA73A9C48C8C8C8B515929E86CBBA83341187B3791F20F71,19 Oct 2015 18:14:37 -0000

Connection: keep-alive

Accept-Encoding: gzip, deflate

Pragma: no-cache

Accept-Language: en-US,en;q=0.5

Content-Length: 2508

Content-Type: text/xml; charset=UTF-8

 

Referência: https://msdn.microsoft.com/en-us/library/jj164022(office.15).aspx.

Abraço!

  1. October 19, 2015 at 16:01

    Boa man! 😀

    Uma outra opção é chamar a função Javascript UpdateFormDigest e ela atualizará o digest automaticamente… Exemplo:
    UpdateFormDigest(_spPageContextInfo.webServerRelativeUrl, _spFormDigestRefreshInterval);

    e depois pegar o digest: $(“#__REQUESTDIGEST”).val();

    Abraços!

    • October 19, 2015 at 16:08

      Hummmmm … bom saber! 🙂

      Legal é isso… para cada situação podemos usar de um jeito diferente. Está rato no javascript né? rsrsrs

      Valeu man! 😀

      • October 19, 2015 at 16:14

        Por causa dos add-ins.. Faz tanto tempo sem solução server-side… saudades do object model 😀

  1. No trackbacks yet.

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.