Utilice un recortador de seguridad personalizado para los resultados de búsqueda de SharePoint Server
Este procedimiento le guía por los pasos para implementar,crear, implementar y registrar, un optimizador de seguridad personalizado para Búsqueda en SharePoint mediante Microsoft Visual Studio 2010.
Búsqueda en SharePoint realiza el recorte de seguridad en tiempo de consulta de los resultados de búsqueda. Sin embargo, puede haber casos en los que desee realizar el recorte de seguridad personalizado. Búsqueda en SharePoint proporciona compatibilidad con estos escenarios a través de Microsoft.Office.Server.Búsqueda. Query.ISecurityTrimmerPre , Microsoft.Office.Server.Búsqueda. Interfaces Query.ISecurityTrimmerPost e ISecurityTrimmer2 (en desuso) en Microsoft.Office.Server.Búsqueda. Espacio de nombres de consulta.
Existen dos tipos de optimización de seguridad personalizada: optimización previa y optimización posterior. La optimización previa se refiere a la evaluación anterior a la consulta en la que la consulta se reescribe para agregar información de seguridad antes de que la consulta coincida con el índice de búsqueda. La optimización posterior se refiere a la evaluación posterior a la consulta en la que los resultados de búsqueda se reducen antes de ser devueltos al usuario. Se recomienda el uso de la optimización previa para un correcto rendimiento y funcionamiento general; la optimización posterior evita que se filtre información de datos de refinería y llegue a instancias de recuento.
El proceso de registro del optimizador de seguridad le permite especificar las propiedades de configuración para el optimizador de seguridad personalizado.
Información general
El recorte de seguridad personalizado en Búsqueda en SharePoint consta de dos interfaces que se pueden usar para realizar el recorte previo o posterior al recorte de los resultados de la búsqueda. Este procedimiento se centra en ambas interfaces, que describe los pasos necesarios para crear y registrar sus propio optimizadores de seguridad.
Requisitos previos
Para completar este tutorial, debe tener instalado en su entorno de desarrollo lo siguiente:
- Búsqueda en Microsoft SharePoint
- Microsoft Visual Studio 2010 o una herramienta de desarrollo compatible con Microsoft .NET Framework similar
Configurar el proyecto del optimizador de seguridad personalizado
En este paso, creará el proyecto del optimizador de seguridad personalizado y, a continuación, agregará las referencias necesarias y el archivo de clase del proyecto del optimizador de seguridad personalizado al proyecto.
Configurar el proyecto del optimizador de seguridad personalizado
- Abra Visual Studio y seleccione Archivo, Nuevo, Proyecto.
- En tipos de proyecto, en C#, elija SharePoint.
- En plantillas, elija Proyecto de SharePoint vacío. En el campo nombre, escriba CustomSecurityTrimmerSample y, a continuación, elija el botón Aceptar.
- En el Asistente para la personalización de SharePoint, elija implementar como solución de granja de servidores y, a continuación, seleccione Finalizar.
Para agregar referencias al proyecto del optimizador de seguridad personalizado
En el menú Proyecto, elija Agregar referencia.
En la ficha . NET, elija las referencias con los siguientes nombres de componente y, a continuación, elija el botón Aceptar:
- Componente de Microsoft Search
Debería ver dos entradas en la ficha .NET con el nombre del componente componente de búsqueda de Microsoft. Seleccione la entrada donde se \ISAPI\Microsoft.Office.Server.Search.dll la columna Ruta de acceso. Si esta entrada falta en la ficha .NET en el cuadro de diálogo Agregar referencias, debe agregar la referencia de la ficha Examinar mediante el uso de la ruta de acceso Microsoft.Office.Server.Search.dll.
- Microsoft.IdentityModel
Si Microsoft.IdentityModel no aparece en la ficha . NET, debe agregar la referencia a Microsoft.IdentityModel.dll desde la ficha Examinar, mediante el uso de la ruta de acceso siguiente:
%ProgramFiles%\\Reference Assemblies\\Microsoft\\Windows Identity Foundation\\v4.0.
Paso 1: Crear el optimizador de seguridad personalizado
Para crear el proyecto para el optimizador de seguridad personalizado
- En el menú Proyecto, elija Agregar nuevo elemento.
- En Elementos de Visual C# en Plantillas instaladas, seleccione código y, a continuación, elija clase.
- Escriba Customsecuritytrimmer.cs y, a continuación, elija Agregar.
La creación del optimizador de seguridad personalizado incluye las siguientes tareas:
El optimizador de seguridad personalizado debe implementar la interfaz ISecurityTrimmerPre. El ejemplo de código siguiente es una implementación básica de esta interfaz.
Para modificar el código predeterminado en CustomSecurityTrimmer
Agregue las siguientes directivas using al principio de la clase:
using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Security.Principal; using Microsoft.IdentityModel.Claims; using Microsoft.Office.Server.Search.Query; using Microsoft.Office.Server.Search.Administration;
Especifique que la clase CustomSecurityPreTrimmer implementa la interfaz de ISecurityTrimmerPre en la declaración de clase, como se muestra en el siguiente código.
public class CustomSecurityPreTrimmer : ISecurityTrimmerPre
Para implementar los métodos de la interfaz ISecurityTrimmer2
Agregue el código siguiente para la declaración del método Initialize().
public void Initialize(NameValueCollection staticProperties, SearchServiceApplication searchApplication) { }
La versión básica de este ejemplo no incluye ningún código en el método Initialize.
Agregue el código siguiente para la declaración del método AddAccess().
public IEnumerable<Tuple<Claim, bool>> AddAccess( IDictionary<string, object> sessionProperties, IIdentity passedUserIdentity) { //AddAccess method implementation, see steps 3-5. }
Para la primera parte de la implementación del método AddAccess, descubrimos quién es el usuario mirando la passedUserIdentity.
if (passedUserIdentity == null) { throw new ArgumentException("AddAccess method is called with invalid user identity parameter", "passedUserIdentity"); } String strUser = null; var claimsIdentity = (IClaimsIdentity)passedUserIdentity; if (claimsIdentity != null) { foreach (var claim in claimsIdentity.Claims) { if (claim == null) { continue; } // strUser is "domain\\\\user" format when web app is in Claims Windows Mode if (SPClaimTypes.Equals(claim.ClaimType, SPClaimTypes.UserLogonName)) { strUser = claim.Value; break; } // strUser2 is "S-1-5-21-2127521184-1604012920-1887927527-66602" when web app is in Legacy Windows Mode // In this case we need to convert it into NT user format. if (SPClaimTypes.Equals(claim.ClaimType, ClaimTypes.PrimarySid)) { strUser = claim.Value; SecurityIdentifier sid = new SecurityIdentifier(strUser); strUser = sid.Translate(typeof(NTAccount)).Value; break; } } }
Crear una lista, rellenar la lista con notificaciones y devuelva la lista, como se muestra en el siguiente código.
var claims = new LinkedList<Tuple<Claim, bool>>(); if (!string.IsNullOrEmpty(strUser)) { var groupMembership = GetMembership(strUser); if (!string.IsNullOrEmpty(groupMembership)) { var groups = groupMembership.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries); foreach (var group in groups) { claims.AddLast(new Tuple<Claim, bool>( new Claim("http://schemas.happy.bdc.microsoft.com/claims/acl", group), false)); } } } return claims; }
El método GetMembership contiene la lógica personalizada de su optimizador.
Paso 1: Crear el optimizador de seguridad personalizado
Para crear el archivo de clase para el optimizador de seguridad
- En el menú Proyecto, elija Agregar nuevo elemento.
- En Elementos de Visual C# en Plantillas instaladas, seleccione código y, a continuación, elija clase..
- Escribacustomsecurityposttrimmer.csy, a continuación, elija Agregar.
Escribir el código del optimizador de seguridad personalizado
Su optimizador de seguridad personalizado debe implementar la interfaz ISecurityTrimmerPost. El ejemplo de código en esta sección es una implementación básica de esta interfaz.
Para modificar el código predeterminado en CustomSecurityPostTrimmer
Y las siguientes directivas de using al comienzo de la clase:
using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Security.Principal; using Microsoft.IdentityModel.Claims; using Microsoft.Office.Server.Search.Query; using Microsoft.Office.Server.Search.Administration;
Especifique que la clase CustomSecurityPostTrimmer implementa la interfaz ISecurityTrimmerPost en la declaración de clase, como se indica a continuación.
public class CustomSecurityPostTrimmer : ISecurityTrimmerPost
Para implementar los métodos de interfaz de ISecurityTrimmerPost
Agregue el código siguiente para la declaración del método Initialize().
public void Initialize(NameValueCollection staticProperties, SearchServiceApplication searchApplication) { }
La versión básica de esta muestra no incluye ningún código en el método Initialize.
Agregue el código siguiente para la declaración del método CheckAccess().
public BitArray CheckAccess(IList<string> documentCrawlUrls, IList<string> documentAcls, IDictionary<string, object> sessionProperties, IIdentity passedUserIdentity) { //CheckAccess method implementation, see steps 3-5. }
Para la primera parte de la implementación del método CheckAccess, declárela e inicializar una variable BitArray para almacenar los resultados de la comprobación de acceso para cada dirección URL de la colección documentCrawlUrls y recuperar el usuario que envió la consulta, como se muestra en el siguiente código.
if (documentCrawlUrls == null) { throw new ArgumentException("CheckAccess method is called with invalid URL list", "documentCrawlUrls"); } if (documentAcls == null) { throw new ArgumentException("CheckAccess method is called with invalid documentAcls list", "documentAcls"); } if (passedUserIdentity == null) { throw new ArgumentException("CheckAccess method is called with invalid user identity parameter", "passedUserIdentity"); }
Recorra cada dirección URL de rastreo de la colección y realice la comprobación de acceso para determinar si el usuario que envió la consulta puede tener acceso a la dirección URL de rastreo contenido elemento asociado, tal como se muestra en el siguiente código.
// Initialize the bit array with TRUE value which means all results are visible by default. var urlStatusArray = new BitArray(documentCrawlUrls.Count, true); var claimsIdentity = (IClaimsIdentity)passedUserIdentity; if (claimsIdentity != null) { var userGroups = GetGroupList(claimsIdentity.Claims); var numberDocs = documentCrawlUrls.Count; for (var i = 0; i < numberDocs; ++i) { if (!string.IsNullOrEmpty(documentAcls[i])) { urlStatusArray[i] = VerifyAccess(documentAcls[i], userGroups); } } }
Si el usuario tiene acceso al elemento de contenido, establezca el valor del elemento BitArray en ese índice, urlStatusArray[i], en true; de lo contrario, establézcalo en false, de la siguiente manera.
Establece el valor devuelto del método CheckAccess a urlStatusArray, como se muestra en el siguiente código.
return urlStatusArray;
Paso 2: Registrar el optimizador de seguridad personalizado
En el paso 2 se describe cómo configurar el optimizador de seguridad personalizado e incluye las siguientes tareas:
- Registrar el optimizador de seguridad personalizado para la aplicación de servicio de búsqueda mediante el uso de los cmdlets de Windows PowerShell.
- Reiniciar el controlador de host de búsqueda de SharePoint (SPSearchHostController).
Paso 2: Registrar el optimizador de seguridad personalizado
Use el Shell de administración de SharePoint para registrar un optimizador de seguridad personalizado con ClassName. En nuestro caso, ClassName podría ser CustomSecurityPreTrimmer o CustomSecurityPostTrimmer. El siguiente procedimiento muestra cómo registrar un optimizador de seguridad personalizado, con el identificador establecido en 1 para la aplicación de servicio de búsqueda.
Para registrar el optimizador de seguridad personalizado
En el Explorador de Windows, busque CustomSecurityTrimmerSample.dll en la ruta de acceso <Local_Drive>:\WINDOWS\assembly.
Abra el menú contextual para el archivo y, a continuación, elija Propiedades.
En la pestaña General del cuadro de diálogo Propiedades, seleccione y copie el token.
Abra el Shell de administración de SharePoint. Para obtener información sobre el uso de esta herramienta, vea Administrar aplicaciones de servicio mediante el Shell de administración de SharePoint 2010.
En el símbolo del sistema, escriba el siguiente comando.
New-SPEnterpriseSearchSecurityTrimmer -SearchApplication "Search Service Application" -typeName "CustomSecurityTrimmerSample.ClassName, CustomSecurityTrimmerSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=token" -RulePath "xmldoc://*"
En el comando , reemplace ClassName por CustomSecurityPreTrimmer o CustomSecurityPostTrimmer y token por el token de clave pública para el archivo CustomSecurityTrimmerSample.dll. Debe asociar todos los optimizadores con una regla de rastreo, "xmldoc://*"; pero esto es opcional para los optimizadores de previa.
Nota:
[!NOTA] Si tiene varios servidores front-end web, debe implementar su optimizador de seguridad en la caché de ensamblados global en todos los servidores web front-end en la granja de servidores.
Verifique que su optimizador de seguridad esté registrado con los siguientes cmdlets de PowerShell:
$searchApp = Get-SPEnterpriseSearchServiceApplication $searchApp | Get-SPEnterpriseSearchSecurityTrimmer
Su optimizador de seguridad debe ser visible en los resultados.
Para reiniciar el controlador de host de búsqueda de SharePoint
Puede reiniciar el servicio de búsqueda escribiendo el siguiente cmdlet de PowerShell.
net restart sphostcontrollerservice