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:
Resposta do contextinfo:
{"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"}}}
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" 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
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!
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!
Hummmmm … bom saber! 🙂
Legal é isso… para cada situação podemos usar de um jeito diferente. Está rato no javascript né? rsrsrs
Valeu man! 😀
Por causa dos add-ins.. Faz tanto tempo sem solução server-side… saudades do object model 😀