quarta-feira, 9 de setembro de 2015

Boas praticas da configuração do cache de objetos do SharePoint


Os recursos Publicação (Publishing), Web Part de Consulta de Conteúdo (Content Query Web Part), navegação (Navigation), web parts da pesquisa e a navegação de metadados (metadata navigation) necessitam do cache de objetos para executar consultas e obter dados:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
The default Portal Super Reader account is NT Authority\Local Service, which is not correctly resolved in a claims authentication application. As a result, if the Portal Super Reader account is not explicitly configured for a claims authentication application, browsing to site collections under this application will result in an “Access Denied” error, even for the site administrator. This error will occur on any site that uses any feature that explicitly uses the object cache, such as the SharePoint Server Publishing Infrastructure, metadata navigation, the Content Query Web Part, or navigation.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

O cache executa a consulta não como o usuário que efetuou a consulta, em vez disso, ele a executa duas vezes: uma com a conta do "Super User" e a outra com a conta do "Super Reader". Os resultados dessas duas consultas são armazenados no cache de objetos. Por isso o cache precisa armazenar resultados para apenas dois usuários, isto diminui a quantidade de memória que é necessária para armazená-lo.

Os resultados para a conta do usuário "Super User" incluem itens de rascunho e os resultados para a conta do "Super Reader" incluem somente itens publicados. O cache de objetos, em seguida, verifica as listas de controle de acesso (ACLs) para o usuário que iniciou o pedido e retorna os resultados apropriados para o usuário. 

Os erros mencionados nesse post ocorrem se as contas do "Super Reader" e "Super User", utilizadas pelo cache de objetos, não foram configuradas ou configuradas incorretamente.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
1.SPRequest.GetAclForScope: UserPrincipalName=i:0).w|<PrimarySID>, AppPrincipalName= ,bstrWebUrl=http://<URL> ,guidScopeId=<GUID> ,fRequirePermissionCheck=True
2.System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)), StackTrace: at Microsoft.SharePoint.SPReusableAcl..ctor(SPRequest request, String webUrl, Guid scopeId, Boolean requirePermissionCheck)   at Microsoft.SharePoint.Publishing.AclCache.GetAclForScope(Guid scopeId, Boolean disposeOfSite)   at Microsoft.SharePoint.Publishing.AclCache.GetAclForScope(Guid scopeId)   at Microsoft.SharePoint.Publishing.CachedArea..ctor(PublishingWeb area, String id, String parentId, CachedUserResource title, String url, CachedUserResource description, CachedObjectFactory factory) [...] 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Script para configurar as contas no SharePoint 2010/2013/2016 (Autenticação Claims)
Obs.: As contas do "Super User" e "Super Reader" devem ser contas separadas e não devem ser usadas para fazer o logon no site.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
## Altere a conta mantendo o claim, exemplo: "i:0#.w|contoso\superuser"
$SU = "i:0#.w|sharepoint\sp_superuser"
## Altere a conta mantendo o claim, exemplo: "i:0#.w|contoso\superreader"
$SR = "i:0#.w|sharepoint\sp_superreader"

foreach ($WA in Get-SPWebApplication)
{
    if($WA.UseClaimsAuthentication)
    {
        $fullPolicy = $WA.Policies.Add($SU, $SU)
        $fullPolicy.PolicyRoleBindings.Add($wa.PolicyRoles.GetSpecialRole
([Microsoft.SharePoint.Administration.SPPolicyRoleType]::FullControl))
        $readPolicy = $wa.Policies.Add($SR, $SR)
        $readPolicy.PolicyRoleBindings.Add($wa.PolicyRoles.GetSpecialRole
([Microsoft.SharePoint.Administration.SPPolicyRoleType]::FullRead))
        $wa.Properties["portalsuperuseraccount"] = $SU;
        $wa.Properties["portalsuperreaderaccount"] = $SR;
        $wa.Update()
    }
}
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Script para configurar as contas no SharePoint 2010/2013 (Autenticação modo clássico)
Obs.: As contas do "Super User" e "Super Reader" devem ser contas separadas e não devem ser usadas para fazer o logon no site.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
## Altere a conta, exemplo: "contoso\superuser"
$SU = "sharepoint\sp_superuser"
## Altere a conta, exemplo: "contoso\superreader"
$SR = "sharepoint\sp_superreader"

foreach ($WA in Get-SPWebApplication)
{
    if($WA.UseClaimsAuthentication)
    {
        $fullPolicy = $WA.Policies.Add($SU, $SU)
        $fullPolicy.PolicyRoleBindings.Add($wa.PolicyRoles.GetSpecialRole
([Microsoft.SharePoint.Administration.SPPolicyRoleType]::FullControl))
        $readPolicy = $wa.Policies.Add($SR, $SR)
        $readPolicy.PolicyRoleBindings.Add($wa.PolicyRoles.GetSpecialRole
([Microsoft.SharePoint.Administration.SPPolicyRoleType]::FullRead))
        $wa.Properties["portalsuperuseraccount"] = $SU;
        $wa.Properties["portalsuperreaderaccount"] = $SR;
        $wa.Update()
    }
}
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Fontes:

SharePoint 2013: Claims Encoding
http://social.technet.microsoft.com/wiki/contents/articles/13921.sharepoint-2013-claims-encoding-also-valuable-for-sharepoint-2010.aspx

How Claims encoding works in SharePoint 2010
http://www.wictorwilen.se/Post/How-Claims-encoding-works-in-SharePoint-2010.aspx

Identity Claims Encoding for SharePoint
http://blogs.msdn.com/b/scicoria/archive/2011/06/30/identity-claims-encoding-for-sharepoint.aspx

Configure object cache user accounts in SharePoint Server 2013
https://technet.microsoft.com/en-us/library/ff758656.aspx

Caching in SharePoint
https://msdn.microsoft.com/en-us/library/ff647588.aspx