Posts recientes

El contenido de este blog tiene una licencia Creative Commons.
Creative Commons

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',''
 
Publicado  en  31/03/2011  por  Javier Tirado Pampín
0  Comentarios  |  Trackback Url  | 0  Enlaces a este post | Bookmark este post con:          
Etiquetas: SQL Server 2008
Technorati Tags:
 

Vinculos a este post

Comentarios