Compartir a través de


Procedimiento para usar el Servicio de almacenamiento seguro desde un ensamblado de conectividad .NET

Última modificación: lunes, 27 de septiembre de 2010

Hace referencia a: SharePoint Server 2010

En este artículo
Uso de Almacenamiento seguro en un ensamblado de conectividad .NET sin código
Uso de Almacenamiento seguro en un ensamblado de conectividad .NET con código
Resumen

Los conectores de bases de datos, servicios web y servicios de Windows Communication Foundation (WCF) usan todos un solo sistema externo. Los Servicios de conectividad empresarial (BCS) de Microsoft se pueden conectar a estos sistemas externos y admiten de forma nativa la integración con Almacenamiento seguro para estos conectores. Sin embargo, para un conector de ensamblado Microsoft .NET Framework, el código de ensamblado .NET puede usar uno, ninguno o varios sistemas externos. Debido a que los Servicios de conectividad empresarial no pueden determinar lo que hace el código de ensamblado .NET, no admiten de forma nativa la integración con Almacenamiento seguro para el conector de ensamblado .NET. Sin embargo, los Servicios de conectividad empresarial proporcionan dos mecanismos distintos para usar Almacenamiento seguro dentro de un ensamblado de conectividad .NET.

En el primer mecanismo (enfoque sin código), los Servicios de conectividad empresarial realizan las operaciones necesarias para leer credenciales desde Almacenamiento seguro. En el segundo mecanismo (enfoque con código), el ensamblado de conectividad .NET realiza las operaciones necesarias. En este tema se describen los dos mecanismos.

Uso de Almacenamiento seguro en un ensamblado de conectividad .NET sin código

Como el nombre indica, el ensamblado de conectividad .NET no interactúa directamente con el Almacenamiento seguro. A través de filtros, puede usar Servicios de conectividad empresarial para leer credenciales desde el Almacenamiento seguro y obtenerlas como parámetros de entrada del método. Este enfoque no es exclusivo del Conector de ensamblado .NET, sino que se puede usar con conectores de bases de datos, de servicios web y de WCF.

Al escribir el método en el ensamblado de conectividad .NET, debe tener parámetros de entrada para las credenciales. En el siguiente ejemplo se muestra el método GetEntity con parámetros de entrada para username y password, y otros parámetros.

public SampleEntity GetEntity(string username, string password, int id)
{ 
    // Parameters username and password 
    // contain the credentials.
}

Para obtener las credenciales de los parámetros username y password, debe usar los filtros UsernameFilter y PasswordFilter. En el modelo de metadatos, debe definir las propiedades SecondarySsoApplicationId y SsoProviderImplementation para LobSystemInstance y asociar los filtros a los parámetros de entrada del método adecuados. Cuando los Servicios de conectividad empresarial encuentran filtros, usan las propiedades SecondarySsoApplicationId y SsoProviderImplementation para el identificador de aplicación de destino de Almacenamiento seguro y el proveedor de Almacenamiento seguro, respectivamente.

<LobSystemInstance ...> 
  <Properties> 
    <!-- Other properties omitted. –> 
    <Property Name="SecondarySsoApplicationId" 
        Type="System.String">MyLobAppId</Property> 
    <Property Name="SsoProviderImplementation" Type="System.String"> 
        Microsoft.Office.SecureStoreService.Server.SecureStoreProvider, Microsoft.Office.SecureStoreService, 
        Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Property> 
  </Properties> 
</LobSystemInstance> 

Ahora definamos los dos filtros para el método.

<Method Name="GetEntity"> 
  <FilterDescriptors> 
    <FilterDescriptor Type="Username" Name="UserNameFilter"/> 
    <FilterDescriptor Type="Password" Name="PasswordFilter"/> 
  </FilterDescriptors> 
</Method>

Ahora que los filtros para el método están definidos, en el siguiente ejemplo se muestra cómo asociar los dos filtros a los parámetros de entrada del método.

<Parameter Direction="In" Name="username">  
    <TypeDescriptor TypeName="System.String" Name="username" 
        AssociatedFilter="UserNameFilter"/> 
</Parameter> 
<Parameter Direction="In" Name="password">  
    <TypeDescriptor TypeName="System.String" Name="password" 
        AssociatedFilter="PasswordFilter"/> 
</Parameter>

Esto es todo lo que necesita para usar Almacenamiento seguro en el ensamblado de conectividad .NET. Cuando los Servicios de conectividad empresarial ejecutan el método, este lee las credenciales desde Almacenamiento seguro y las establece en los parámetros de entrada del método.

Uso de Almacenamiento seguro en un ensamblado de conectividad .NET con código

Antes de escribir código para usar Almacenamiento seguro, debe comprender cómo los Servicios de conectividad empresarial usan Almacenamiento seguro en otros conectores. En los Servicios de conectividad empresarial, otros conectores dependen del modelo de metadatos para la información que necesitan sobre Almacenamiento seguro y el identificador de aplicación de destino. Los conectores usan esta información para recuperar credenciales para autenticar con el sistema externo. Por ejemplo, para el conector de bases de datos, las propiedades para LobSystemInstance del modelo de metadatos aparecen como se indica en el siguiente ejemplo.

<LobSystemInstance ...> 
  <Properties> 
    <!-- Other properties omitted. –> 
    <Property Name="SsoApplicationId" 
        Type="System.String">MyLobAppId</Property> 
    <Property Name="SsoProviderImplementation" Type="System.String"> Microsoft.Office.SecureStoreService.Server.SecureStoreProvider, Microsoft.Office.SecureStoreService, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Property> 
  </Properties> 
</LobSystemInstance>

El conector de bases de datos lee el modelo de metadatos y determina que necesita credenciales para conectarse a la base de datos; las credenciales se pueden obtener desde el proveedor de Almacenamiento seguro especificado. Cuando el conector de bases de datos tiene la información necesaria para el proveedor de Almacenamiento seguro, lee las credenciales del proveedor y suplanta el usuario para la conexión de base de datos.

En las siguientes secciones se explica cómo leer propiedades de modelo de metadatos dentro del código de ensamblado .NET y usar las API de Almacenamiento seguro para leer credenciales de usuario.

Lectura de propiedades de modelo de metadatos en el ensamblado de conectividad .NET

Para leer propiedades de modelo de metadatos en el ensamblado de conectividad .NET, el código del ensamblado .NET debe implementar la interfaz IContextProperty. El siguiente código muestra un ejemplo de implementación de la interfaz IContextProperty.

Ejemplo de implementación de IContextProperty

using IContextProperty = Microsoft.BusinessData.SystemSpecific.IContextProperty; 
public class SampleConnector : IContextProperty 
{ 
    private IMethodInstance methodInstance; 
    private ILobSystemInstance lobSystemInstance; 
    private IExecutionContext executionContext;
    #region IContextProperty implementation 
    public IMethodInstance MethodInstance 
    { 
        get { return this.methodInstance; } 
        set { this.methodInstance = value; } 
    }
    public ILobSystemInstance LobSystemInstance 
    { 
        get { return this.lobSystemInstance; } 
        set { this.lobSystemInstance = value; } 
    } 
    public IExecutionContext ExecutionContext 
    { 
        get { return this.executionContext; } 
        set { this.executionContext = value; } 
    } 
        #endregion 
        // Unrelated code removed for brevity. 
} 

Cuando la clase de ensamblado de conectividad .NET implementa la interfaz IContextProperty, el tiempo de ejecución de los Servicios de conectividad empresarial inicializa automáticamente propiedades IContextProperty.

En tiempo de ejecución, el código tiene el contexto (instancia de método y LobSystem Instance) en el que se ejecuta; un método que se implementa en el código puede leer las propiedades del modelo de metadatos. El siguiente código muestra cómo se leen las propiedades LobSystemInstance.

public SampleEntity GetEntity(int id) 
{ 
    // Read the LobSystemInstance property defined in the metadata model. 
    string provider =  
        LobSystemInstance.GetProperties()["ssoProviderImplementation"] 
        as string; 
    // Unrelated code removed for brevity. 
} 

Interacción con el Servicio de almacenamiento seguro

Cuando el ensamblado de conectividad .NET necesite leer una credencial desde Almacenamiento seguro, use los siguientes nombres de propiedad.

  • ssoProviderImplementation: proveedor de Almacenamiento seguro

  • SecondarySsoApplicationId: aplicación de destino para Almacenamiento seguro

Las propiedades ssoProviderImplementation y SecondarySsoApplicationId se admiten para crear modelos de conector de ensamblado .NET en Microsoft SharePoint Designer 2010. Si el ensamblado de conectividad .NET necesita leer más de una credencial desde Almacenamiento seguro, elija el nombre de propiedad que sea más adecuado para su escenario.

Ejemplo de implementación para lectura de credenciales desde Almacenamiento seguro

El primer paso consiste en crear una instancia del proveedor de Almacenamiento seguro desde la implementación de proveedor. En el código, asegúrese de que el proveedor implemente la interfaz ISecureStoreProvider. En el siguiente ejemplo se muestra una implementación simple para crear una instancia del proveedor de Almacenamiento seguro.

private ISecureStoreProvider GetSecureStoreProvider() 
{
    // Error checking removed for brevity.
string provider = this.LobSystemInstance.GetProperties()  
    ["ssoProviderImplementation"] as string; 
Type providerType = Type.GetType(provider); 
return Activator.CreateInstance(providerType)  
    as ISecureStoreProvider;
} 

Después de que se crea una instancia del proveedor de Almacenamiento seguro, obtenga las credenciales desde Almacenamiento seguro. Almacenamiento seguro devuelve SecureStoreCredentialCollection para el usuario y un identificador de destino, que contiene una colección de credenciales. La interfaz ISecureStoreCredential define el tipo y el valor de las credenciales.

En el siguiente ejemplo se muestra cómo se leen las credenciales desde Almacenamiento seguro. Estas credenciales se pueden usar para autenticación con un sistema externo.

private void ReadCredentialsFromSecureStore() 
{ 
    // Error checking removed for brevity. 
    string targetId = 
        LobSystemInstance.GetProperties()["SecondarySsoApplicationId"]  
        as string; 
    ISecureStoreProvider provider = GetSecureStoreProvider();
    // Get the credentials for the user on whose behalf the code 
    // is executing. 
    using(SecureStoreCredentialCollection credentials =      
        provider.GetRestrictedCredentials(targetId)) 
    { 
        SecureString secureUsername; 
        SecureString securePassword; 
         // Look for username and password in credentials. 
        foreach (ISecureStoreCredential credential in credentials) 
        { 
            switch (credential.CredentialType) 
            { 
                case SecureStoreCredentialType.UserName: 
                case SecureStoreCredentialType.WindowsUserName: 
                    secureUsername = credential.Credential; 
                    break; 
                case SecureStoreCredentialType.Password: 
                case SecureStoreCredentialType.WindowsPassword: 
                    securePassword = credential.Credential; 
                    break; 
                default: 
                    break; 
            } 
        } 
        // Username and password have been read. 
        // Use them as necessary.  
    } 
     // NOTE:  Because we are getting the credentials in the using block,  
    // all the credentials that we get will be disposed after the 
    // using block. If you need to cache the credentials,  do not use 
    // a using block but dispose the credentials when you are done 
     // with them.
} 

Resumen

Según el escenario, puede elegir el enfoque sin código o el enfoque con código para usar Almacenamiento seguro en el ensamblado de conectividad .NET. En la tabla 1 se resumen las diferencias entre estos dos enfoques.

Tabla 1. Resumen de diferencias entre enfoques con y sin código

Área

Enfoque sin código

Enfoque con código

Se requiere interacción con API de Almacenamiento seguro

No

Exclusivo del conector de ensamblado .NET

No

Compatible con SharePoint Designer

Parcial

Afecta a la firma de método

No

Lectura desde varios almacenes seguros

No

Las credenciales se pueden configurar en el nivel de LobSystemInstance

No