Share via


Paso 3 (opcional): Especificar un límite configurable del número de direcciones URL de rastreo comprobadas

En este tutorial se describe cómo crear, implementar y registrar un optimizador de seguridad personalizado para Enterprise Search de Microsoft Office SharePoint Server 2007 mediante Microsoft Visual Studio 2005.

Al registrar un optimizador de seguridad personalizado mediante la utilidad stsadm, puede especificar propiedades de configuración opcionales con la operación registersecuritytrimmer. Esto permite crear un optimizador de seguridad personalizado cuya configuración puede modificarse.

Por ejemplo, puede crear un optimizador de seguridad personalizado con un límite configurable en el número de elementos comprobados por el optimizador de seguridad. Si bien es opcional, es aconsejable incluir algún tipo de límite en la implementación del optimizador de seguridad. Para obtener más información, consulte Información general del Optimizador de seguridad personalizado para los resultados del motor de búsqueda Enterprise Search.

En el paso 3 se describe cómo crear y registrar un optimizador de seguridad personalizado con un límite configurable en el número de documentos comprobados, e incluye las tareas siguientes:

  • Codificación del optimizador de seguridad personalizado

  • Registro del optimizador de seguridad personalizado

El optimizador de seguridad personalizado que se describe en este ejemplo es parecido al que se describe en el Paso 1: Crear el optimizador de seguridad personalizado y en el Paso 2: implementación y registro del optimizador de seguridad personalizado. No obstante, en este optimizador de seguridad personalizado se incluyen pasos adicionales para definir un límite en la implementación, y cambiar el comando de la utilidad stsadm que se utiliza para registrar el optimizador de seguridad personalizado.

Codificación del optimizador de seguridad personalizado

Antes de iniciar la tarea que se describe aquí, cree el proyecto CustomSecurityTrimmer y modifique la clase CustomSecurityTrimmer, como se describe en el Paso 1: Crear el optimizador de seguridad personalizado.

Nota

En este tema no se repiten las tareas ya especificadas en los pasos 1 y 2; sólo se describen las tareas que son distintas. Para obtener información sobre los pasos anteriores, consulte el Paso 1: Crear el optimizador de seguridad personalizado y el Paso 2: implementación y registro del optimizador de seguridad personalizado.

Para codificar el optimizador de seguridad personalizado

  1. Una vez que haya modificado la declaración de clase para implementar la interfaz ISecurityTrimmer, declare una variable para el valor de límite, como se indica a continuación.

    class CustomSecurityTrimmer : ISecurityTrimmer
    {
        /*
           Sets a default limit of 200. You can change this 
           to a value that meets your specific requirements.
        */ 
        private int intCheckLimit = 200;
    
  2. Cree un método para comparar el número de elementos para los que se comprueba el límite configurado, y agregue el código siguiente.

    private bool CheckLimit(IDictionary<String, Object> sessionProperties, int numChecks)
    {
        Object currentCount;
        sessionProperties.TryGetValue("currentCheckCount", out currentCount);
        if (currentCount == null)
        {
            sessionProperties["currentCheckCount"] = numChecks;
            return (true);
        }
        int currentCountInt = Convert.ToInt32(currentCount);
        currentCountInt += numChecks;
        sessionProperties["currentCheckCount"] = currentCountInt;
        if (currentCountInt <= intCheckLimit)
        {
            return true;
        }
        else
        {
        return false;
        }
    }
    
  3. Para completar el código para el ejemplo de optimizador de seguridad personalizado, debe modificar las implementaciones de método Initialize y CheckAccess como se describe en el Paso 1: Crear el optimizador de seguridad personalizado.

Para modificar las implementaciones de método de la interfaz ISecurityTrimmer

  1. Agregue el código siguiente al método Initialize.

    if (trimmerProps["CheckLimitProperty"] != null)
    {
       intCheckLimit = Convert.ToInt32(trimmerProps["CheckLimitProperty"]);
    }
    

    Este código establece el límite para el número máximo de documentos para los que el optimizador de seguridad comprobará el valor de una propiedad de configuración denominada CheckLimitProperty.

    Nota

    Puede especificar las propiedades de configuración al registrar el optimizador de seguridad.

  2. Agregue el código siguiente al método CheckAccess, inmediatamente después de la declaración del método.

    if (!this.CheckLimit(sessionProperties, crawlURLs.Count))
    {
        throw (new PluggableAccessCheckException("<Display Message>"));
    }
    

    Este código llama al método CheckLimit. Si se ha alcanzado el límite, este método devuelve false. En este caso, se desencadena una excepción PluggableAccessCheckException y, en lugar de los resultados de la búsqueda, se muestra el texto especificado en el constructor PluggableAccessCheckException en la interfaz de usuario de resultados de la búsqueda.

Registro del Optimizador de seguridad personalizado

Antes de iniciar este paso, debe implementar CustomSecurityTrimmerSample.dll en la caché de ensamblado global, descrita en el Paso 2: implementación y registro del optimizador de seguridad personalizado. A continuación, puede registrar el optimizador de seguridad optimizado mediante la utilidad stsadm.

El procedimiento siguiente muestra cómo registrar un optimizador de seguridad personalizado con el Id. establecido en 1 para el SPP (Shared Services Provider)SharedServices1, que se aplica al contenido ubicado en los recursos compartidos de archivos para un servidor denominado FileServer1. También establece el valor de configuración CheckLimitProperty en 300.

Para registrar el optimizador de seguridad personalizado con la configuración CheckLimitProperty

  • En el símbolo del sistema, escriba el siguiente comando.

    stsadm -o registersecuritytrimmer -ssp SharedServices1 -id 1 -typeName "CustomSecurityTrimmerSample.clsCustomSecurityTrimmer, CustomSecurityTrimmerSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=<token>" -rulepath file://FileServer1/* -configprops CheckLimitProperty~300 
    

Ejemplo

A continuación se muestra el código de ejemplo completo para la clase CustomSecurityTrimmerSample descrita en este paso.

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Office.Server.Search.Query;
using Microsoft.Office.Server.Search.Administration;
//For Windows Authentication
using System.Security.Principal;
//For Forms Authenticaion
using System.Web;
using System.Collections.Specialized;
using System.Collections;

namespace CustomSecurityTrimmerSample
{
    class CustomSecurityTrimmer : ISecurityTrimmer
    {
        private int intCheckLimit = 200;
        public void Initialize(NameValueCollection trimmerProps, SearchContext searchCxt)
        {
            if (trimmerProps["CheckLimit"] != null)
            {
                intCheckLimit = Convert.ToInt32(trimmerProps["CheckLimit"]);
            }
        }

        public BitArray CheckAccess(IList<String> crawlURLs, IDictionary<String, Object> sessionProperties)
        {
            BitArray retArray = new BitArray(crawlURLs.Count);
            if (!this.CheckLimit(sessionProperties, crawlURLs.Count))
            {
                throw (new PluggableAccessCheckException("Reached Limit"));
            }
        //For Windows authentication, uncomment the next line:
            //string strUser = WindowsIdentity.GetCurrent().Name;
        //For Forms authentication, uncomment the next line:
           //string strUser = HttpContext.Current.User.Identity.Name;
            for (int x = 0; x < crawlURLs.Count; x++)
            {
               /*
                Add code here to check if
                strUser can access crawlURLs[x]. 
                If so:
                retArray[x] = true;
                If not:
                retArray[x] = false;
              */
            }
            return retArray;
        }

        private bool CheckLimit(IDictionary<String, Object> sessionProperties, int numChecks)
        {
            Object currentCount;
            sessionProperties.TryGetValue("currentCheckCount", out currentCount);
            if (currentCount == null)
            {
                sessionProperties["currentCheckCount"] = numChecks;
                return (true);
            }
            int currentCountInt = Convert.ToInt32(currentCount);
            currentCountInt += numChecks;
            sessionProperties["currentCheckCount"] = currentCountInt;
            if (currentCountInt <= intCheckLimit)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

Vea también

Referencia

Microsoft.Office.Server.Search.Query.ISecurityTrimmer
Microsoft.Office.Server.Search.Query.PluggableAccessCheckException

Otros recursos

Información general del Optimizador de seguridad personalizado para los resultados del motor de búsqueda Enterprise Search
Tutorial: Uso de un optimizador de seguridad personalizado para los resultados de la búsqueda
Paso 1: Crear el optimizador de seguridad personalizado
Paso 2: implementación y registro del optimizador de seguridad personalizado