Codepoint

by Trentia Consulting

LLamada a un Web Service de creación de usuarios de SharePoint a través de un ensamblado de SQL Server

Como es sabido, SQL Server 2008/2005 permite integración de ensamblados de .NET para interactuar entre otras, con fuentes externas.

Pues bién, esta entrada va a tratar la problematica de la creación de usuarios de SharePoint con autentificación por FBA. El motivo es simplemente que cuando queremos importar las tablas de usuario de ASP.NET desde una fuente externa, no podemos insertar los datos completos del usuario, esto únicamente se puede hacer desde SharePoint.

Manos a la obra, en primer lugar hemos de crear Web Service para la creación del usuario en SharePoint del siguiente estilo:

[WebMethod]
public void CreateUser(string Site, string UserProvider,string UserId, string UserName) 
{
	SPSecurity.RunWithElevatedPrivileges(delegate()
	   {
		   using (SPSite site = new SPSite(Site))
		   {
			   SPWeb web = site.RootWeb;
			   web.AllUsers.Add(UserProvider + "|" + UserId, "", UserName, "");
			   web.EnsureUser(UserProvider + "|" + UserId);
		   }
	   });
			
}

Una vez creado, hemos de crear un proxy del WebService a través de la utilidad WSDL.EXE(lo podéis encontrar en C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\x64)

La llamada será del estilo:

WSDL.exe /o MyServiceProxy.cs /n Trentia.SPUsers http://<URLdelWebService>

Con la clase resultante ya podemos insertarla en nuestro proyecto de biblioteca de clases de SQL Server.

El siguiente paso, es crear nuestra clase que será invocada a través de SQL:

[SqlProcedure]
public static void GetMessage(SqlString WSUrl, SqlString SiteURL, SqlString UserProvider, SqlString UserID, SqlString UserName
   , out SqlString strMessge)
{

	try
	{
		Service1 svc = new Service1();
		svc.Url = WSUrl.ToString();
		//svc.Credentials = CredentialCache.DefaultCredentials;
		// call web service method; return as a DataTable
		svc.CreateUser(SiteURL.ToString(), UserProvider.ToString(), UserID.ToString(), UserName.ToString());

		strMessge = "OK";
	}
	catch (Exception ex)
	{
		strMessge = ex.ToString();
	}
}

En algunas ocasiones, sobre todo cuando intentamos acceder a WebServices e intercambiar datos, hemos de generar una clases serializable del ensamblado.

Para ello, hemos de ejecutar otra utilidad llamada SGEN.exe ubicada también en C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\x64

La ejecución es la siguiente:

SGEN.exe /a: <RutaYEnsambladoDLL> /compiler:keyfile:<RutaYFicheroSNK>

Con el ensamblado generado por el Visual Studio y el ensamblado generado con la utilidad SGEN.exe, ya tenemos todo lo suficiente para realizar las llamadas a través del SQL Server.

Desde el SQL Server, en primer lugar hemos de habilitar una seria de parámetros en nuestra BBDD

sp_configure 'clr enabled', 1
GO
reconfigure
GO

ALTER DATABASE [DATABASENAME]
SET TRUSTWORTHY ON
GO

CREATE ASSEMBLY MSSQLTipsCLRLib 
FROM 'c:\Trentia.SQLAssemblySharePointUsers.dll'
WITH PERMISSION_SET = UNSAFE /* SI DA ERROR: EXEC dbo.sp_changedbowner @loginame = N'sa', @map = false **/

CREATE ASSEMBLY [MSSQLTipsCLRLib.XmlSerializers]
FROM 'c:\Trentia.SQLAssemblySharePointUsers.XmlSerializers.dll'
WITH PERMISSION_SET = SAFE

 

Una vez tenemos los ensamblados cargados únicamente nos queda crear un PROCEDURE que será quien invoque el ensamblado.

Para ello:

CREATE PROCEDURE [dbo].[AddSPUser]

   @WSUrl NVARCHAR(200),
   @SiteURL NVARCHAR(200),
   @UserProvider NVARCHAR(200),
   @UserID NVARCHAR(200),
   @UserName NVARCHAR(200),
   @strMessge NVARCHAR(400) OUT
  

WITH EXECUTE AS CALLER
AS
EXTERNAL NAME MSSQLTipsCLRLib.SPCreateUserProfileSharePoint.GetMessage
GO

EXEC DBO.AddSPUser 'http:///_vti_bin/SPUser.asmx','HTTP:///','i:0#.f|proveedoraspnet','1019','juanito',''

Agregar comentario

Loading