martes 3 de noviembre de 2009

Authentication failed because the remote party has closed the transport stream

Hace poco en una implementación más, de mi producto favorito: vodka con jugo de piña MOSS 2007, me tope con un error al momento de intentar acceder a la página de configuración de búsquedas que se encuentra dentro de la web application Admin del SSP (Shared Services Provider) http://myserver:11300/ssp/admin/_layouts/searchsettings.aspx.


El error decía algo más o menos así:


Could not connect to server “SERVER_NAME” for application 'SSP'. This error might occur if the server is not responding to client requests, the firewall or proxy configuration is preventing the server from being contacted, or the search administration Web service is not running on the server.


Inmediatamente después intente accede a la página de administración de búsquedas: http://myserver:11300/ssp/admin/searchadministration.aspx., para ver si por ahí podía arreglar este problema, pero aquí surgió otro mensaje de error OMFG!:


Authentication failed because the remote party has closed the transport stream.


Al revisar los logs de SharePoint, me di cuenta que el servidor1 no se podía comunicar con el webservice del servicio de búsqueda del servidor2. Ya que este le denegaba el acceso a la url:


https://server2:56738/SharedServicesProvider1/Search/SearchAdmin.asmx.


Después de maldecir buscar un rato en la red, me encontré que este es un issue conocido por Microsoft y es documentado por el kb “You cannot browse to an SSL-secured Office SharePoint Server 2007 site or to the Search Settings page for a Shared Services Provider”.


Y es provocado por el .Net Framework 3.5 SP 1, que hace que los certificados auto firmados (“self signed”), sean corruptos o no sean de confianza. Sin embargo la solución es sencilla, a continuación los pasos de manera resumida de los que se debe hacer en cada uno de los servidores.












2.- Parar el servicio de busqueda con el commando net stop osearch.



3.- En cada uno de los servidores de la granja de SharePoint ejecutar el comando selfssl /s:951338967 /v:1000, utilizando la utilería selfssl que acabamos de instalar. El directorio de default de instalación es: “c :\Program Files\IIS Resources\SelfSSL”

Parametros:

/s: 951338967. El valor 951338967, se refiere al Id de los servicios web de Office Server, para servidores de 64 bits. Si tu servidor es de 32 bits, el id que debes usar es el 1720207907
/v:1000. Número de días por los que el certificado será válido, Aquí puedes usar un numero mas grande, si así lo deseas.

4.- Por último, pero no menos imprtante, reiniciar el servicio de busqueda, con el comando net start osearch




Recursos:

lunes 2 de noviembre de 2009

Recursos de mi participación en la 2da semana Académica en el TESSFP

Como había prometido, dejo la presentación que realice en pasados días en el TESSFP. Gracias por la invitación a participar en este evento académico, en donde hubo grandes expositores y grandes platicas para los alumnos.

Fue una experiencia enriquecedora.

Espero verlos pronto de nuevo.














jueves 22 de octubre de 2009

La cuenta regresiva para Visual Studio 2010

Es oficial, Visual Studio 2010 saldrá a la luz el 22 de Marzo del 2010, la cuenta regresiva ha comenzado, ahora que el beta 2 ha sido liberado para todos nosotros los pobres diablos no subscriptores de MSDN.



Habilitar Assembly Caching en Silverlight 3

Una de las muchas nuevas caracteristicas de Silverlight 3, es la posibildad de habilitar la caracteristica Assembly Caching, la cual nos permite indicarle al navegador que cargue los ensamblados que nuesta aplicación necesita (archivo .xap) bajo demanda y no todos al cargar la página, como funcionaba en la versión 2.0.

Para lograr esto, solo debe seleccionarse la opción “Reduce XAP size by using appication library caching”, en el apartado de propiedades de nuestro proyecto Silverlight. También debemos notar como ahora se crean archivos con extensión.zip para cada uno de los ensamblados que la aplicación ocupa y que serán descargados bajo demanda.  Como se puede observar a continuación:



Cuando la opción no es seleccionada, el archivo resultante xap, es más grande que cuando la opción es seleccionada. Como se puede ver en las siguientes imágenes comparativas.

Opción NO habilitada






Opción habilitada






Pongamos especial atención en el archivo AppManifest.xaml y la sección Deployment.ExternalPart, en la cual se indica cuales son los ensamblados que nuestra aplicación referencia y que serán descargados cuando así se requiera, estos son los ensamblados “cacheados”. Sin embargo noten que hay algunos ensamblados que no son marcados para ser cacheados, como: CachedAssembly.dll o los ensamblados del silverlight toolkit.

Para que esto suceda se debe crear el archivo XXXX.extmap.xml. Y después de crearlo recompilar el proyecto, y automáticamente se creara el archivo XXXX.zip, el cual será copiado a la carpeta ClientBin de la aplicación ASP.Net.  Para facilitar un poco esto, puedes ocupar la utilería Emm, la cual crea automáticamente el archivo XXXX.extmap.xml a partir de tu ensamblado ejecutando un comando como el siguiente:



Nota, para el correcto funcionamiento de esta utilería, el ensamblado debe tener un SN (strong name)



Además también se puede usar para los ensamblados del Silverlight Toolkit, de esta forma solo se descargaría en primera instancia nuestro ensamblado y todos los demás ensambados seria descargados “on demand”. Ejemplo:







En resumen, esta característica es muy poderosa para el mejor desempeño de tus aplicaciones silverlight.

Descargar solución de Ejemplo

Happy Coding!

martes 20 de octubre de 2009

Silverlight Toolkit Octubre 2009

Ya está disponible la última actualización del silverlight toolkit de Octubre del 2009, y como en cada release, esta versión nos trae nuevas y llamativas funcionalidades, y esta no se podía quedar atrás. Las nuevas características, por mencionar algunas:

  • Soporte para Visual Studio 2010, que por cierto se acaba de liberar el día de ayer la beta 2.
  • Todas las clases base del namespace Data Visualization han sido “unsealed”, es decir, ya es posible heredar de ellas y así extender su funcionalidad.
  • La interface ISeries ahora es la interface base de todos los tipos de series para las graficas.
  • Se ha agregado el assembly System.Windows.Controls.Data.Toolkit y el assembly System.Reactive
  • Soporte para Drag and Drop para elementos tales ListBox, TreeView, DataGrid y DataPointSeries.

A continuación una pequeña demostración de esta última característica, realmente es muy fácil su uso y es mucho el valor que agrega a nuestros desarrollos.






Aquí algunos recursos de donde pueden profundizar en el tema:
Silverlight Toolkit de Octubre 2009
Drag and Drop Support

De aquí pueden descargar el código completo.

Happy Coding!

viernes 2 de octubre de 2009

Establecer el host-header de una web application con https binding en IIS 7

Expondré un escenario que nos ocurrió hace poco en una implementación de SharePoint:

Creamos una nueva SharePoint web application, de la forma que ya conocemos, esta web application llamada SecureWebApplication, usara ssl y vivirá en el puerto 80, por lo que la url que da de la siguiente forma: https://securewebaaplication. Al crear esta web application le asignamos un host header, ya que conocemos previamente de la existencia de otra aplicación que se está ejecutando en este puerto.
Después de que la creación de la web application y site collection se llevaron a cabo satisfactoriamente, nos percatamos que la web application no responde, vamos al IIS y encontramos con que el sitio está detenido, intentamos iniciarlo, pero aparece un mensaje indicándonos que existe otro sitio que se encuentra utilizando el mismo puerto.




Efectivamente, existen otros sitios que se encuentra en el puerto 80, pero con host-headers diferentes, entonces, ¿por qué no puede iniciar nuestro sitio web?


Un poco de aburrida teoría…

Existen tres datos que definen la unicidad de un sitio web, los cuales son:

  • Dirección IP
  • Puerto
  • Host name (host-header)
A la suma de estos tres datos se le conoce como binding,  y define a un sitio web que escucha en una ip:puerto con un host-header especifico.

Cuando se recibe una petición, el componente HTTP.sys lee las propiedades de  configuración del sitio al cual se hace la petición, tales como: tiempo de timeout, limite de conexiones y el certificado que utiliza el sitio

Pero para saber a qué sitio se está haciendo la petición, HTTP.sys utiliza el binding (los tres componentes arriba mencionados),  recordemos que el certificado es necesario para desencriptar los datos encriptados que el cliente envía (en donde viene el host-header)

O sea, que tenemos una dependencia circular. Por una parte necesitamos el certificado para desencriptar la información enviada y de ahí recuperar el binding para a su vez poder leer las propiedades de configuración. Y por otro lado necesitamos primero leer las propiedades de configuración para obtener el certificado y así desencriptar la información que viene del cliente. WTF!

En IIS 7, cuando nosotros creamos un binding https en un sitio web,  este automáticamente deshabilita el que nosotros podamos escribir el host-header, porque el host-header esta embebido en el certificado





 






Y después de toda esta reseña, la solución a esto es una pequeña utilería que se encuentra en la carpeta %windir%\system32\inetsrv, llamada appcmd, con la cual podemos forzar a que el host-header del https binding sea establecido. Con algo más o menos asi:



appcmd.exe set site /site.name:securewebaaplication /bindings.[protocol='https',bindingInformation='*:443:'].bindingInformation:*:443:securewebaaplication

Y el resultado final













Pueden revisar este enlace, para mas detalles.

lunes 21 de septiembre de 2009

Creando Editor Parts personalizados para webparts de SharePoint utilizando Silverlight

Hoy mostraré un ejemplo de cómo escribir un Custom Editor Part para una webpart de SharePoint, en realidad esto no tiene mucha ciencia si no es por el hecho de que utilizaré Silverlight(como siempre) para crear Editor Parts, con una experiencia rica al usuario final.


Creación de la webpart
Primero crearé una simple webpart, llamada SampleWebPart,  con un control Label, que tendrá el valor del color actual del fondo en formato hexadecimal.




Para crear un custom Editor Part los pasos a seguir son los siguientes:


Crear una clase que herede de EditorPart, que se encuentra definido dentro del namespace System.Web.UI.WebControls.WebParts, para este ejemplo crearé una clase llamada ColorEditor, que servirá para editar la propiedad BackColor de SampleWebPart. BackColor es una propiedad que sobrescribiré, ya que esta es una propiedad heredada, y solo le estoy agregando el custom Editor Part. A Continuación el código de la clase ColorEditor.cs:


using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Web.UI.SilverlightControls;

namespace Blog.Webparts.WebPartCode
{
    public class ColorEditor : EditorPart
    {
        HiddenField hiddenField;
        public override bool ApplyChanges()
        {
            this.EnsureChildControls();
            SampleWebpart s = (SampleWebpart)this.WebPartToEdit;
            
            //obtenemos el valor del hidden control
            string strcolor = hiddenField.Value;
            Color c = Color.Transparent.FromHex(strcolor);
            s.BackColor = c;
            return true;
        }

        public override void SyncChanges()
        {
            this.EnsureChildControls();
            SampleWebpart s = (SampleWebpart)this.WebPartToEdit;
            Color c = s.BackColor;
            hiddenField.Value = c.ToHex();
        }

        protected override void CreateChildControls()
        {
            base.CreateChildControls();
            try
            {
                hiddenField = new HiddenField();
                hiddenField.ID = "hfcolorPicker";
                base.Controls.Add(hiddenField);

                Silverlight slControl = new Silverlight();
                slControl.ID = "slColorPicker";
                slControl.InitParameters = "controlid=" + hiddenField.ClientID;
                slControl.Source = "/ClientBin/ColorPickerEditor.xap";
                slControl.Width = 300;
                slControl.Height = 250;
                slControl.MinimumVersion = "2.0.31005.0";
                slControl.Windowless = true;
                base.Controls.Add(slControl);
            }
            catch(Exception ex)
            {
            }
        }
    }
}


En esencia, la creación de un custom editor part, es muy parecida a la creación de una webpart, ya que podemos sobreescribir el método CreateChildControls para agregar los controles que conformarán el editor. Pero además, se heredan dos métodos abstractos que deben ser implementados, SyncChanges y ApplyChanges etc


El método SyncChanges
Este método, tomara los valores actuales de la webpart y los establecera a los controles de el custom editor. Cuando se carga el custom editor, este método es el primero que se ejecuta, no el OnLoad, ni el CreateChildControls (por eso se debe hacer una llamada a EnsurechildControls al inicio de este método)


El método ApplyChanges
Este método se encargara de reflejar los valores establecidos en el custom editor a nuestra webpart target.
Para hacer referencia a la webpart de la cual estamos leyendo/escribiendo valores, lo hacemos mediante la propiedad WebPartToEdit.


El método CreateChildControls
Es en este método donde se crean los controles que conformarán la interfaz del custom editor part, como se observa en el siguiente snippet, he instanciado un objeto de la clase Silverlight, que se encuentra en el namespace System.Web.UI.SilverlightControls,  que es la que nos permite renderear objetos silverlight en el cliente, solo estableciendo unas cuantas propiedades. Además he agregado un control HiddenField, que utilizaré como medio de comunicación entre el código silverlight y la clase ColorEditor.cs
El control ColorPicker es totalmente una creación de Matthias Shapiro, de su post Final-ish  Silverlight Color  Picker Utility, y que muy amablemente puso a disposición de la comunidad. Many thanks Matthias!. Yo solo he modificado la página contenedora de este control, para que acepte como parámetro el id del hidden field y así guardar el valor del color establecido a través del color picker.



Sobrescribir el método CreateEditorParts dentro de la clase SampleWebPart, lo anterior, para instruir a WSS a que cargue nuestro custom editor part además de los Editor Parts estándar que son normalmente desplegados en el Tool Panel. En esta parte utilizamos colecciones de tipo EditorPartCollection. Como se observa en el código siguiente,  debemos agregar todos los custom editor parts a la colección de la clase base para crear una nueva instancia de EditorPartCollection.
Es importante establecer la propiedad ID del los objetos de tipo EditorPart, de lo contrario obtendremos errores al intentar ejecutar nuestro código.


public override EditorPartCollection CreateEditorParts()
{
 List<Editorpart> editor = new List<Editorpart>();
 EditorPart ep = new Blog.Webparts.WebPartCode.ColorEditor();
 ep.ID = this.ID + "_ColorEditor";
 editor.Add(ep);
 EditorPartCollection baseEditors = base.CreateEditorParts();
 return new EditorPartCollection(baseEditors, editor );
}


Al final podremos observar como la experiencia de usuario se ve bastante enriquecida al usar tecnologías como Silverlight.







Por último, el codigo completo de la clase SampleWebPart
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.WebControls;
using System.Drawing;
using System.ComponentModel;
using System.Drawing.Design;
using Blog.Webparts.WebPartCode;

namespace Blog.Webparts
{
    [Guid("057b92f2-193e-4ac4-ba28-bf06e6180aa2")]
    public class SampleWebpart : Microsoft.SharePoint.WebPartPages.WebPart, IWebEditable
    {
        private bool _error = false;
        Label lbl1;

        [Personalizable(PersonalizationScope.Shared)]
        [WebBrowsable(false)]
        [WebDisplayName("Color de fondo")]
        [WebDescription("Color de fondo")]
        [DefaultValue(typeof(Color), "Red")]
        public override Color BackColor
        {
            get
            {
                return base.BackColor;
            }
            set
            {
                base.BackColor = value;
            }
        }
        public SampleWebpart()
        {
            this.ExportMode = WebPartExportMode.All;
        }

        /// 
        /// Create all your controls here for rendering.
        /// Try to avoid using the RenderWebPart() method.
        /// 
        protected override void CreateChildControls()
        {
            if (!_error)
            {
                try
                {
                    base.CreateChildControls();

                    lbl1 = new Label();
                    lbl1.ID = "lblInitialDate";
                    lbl1.Width = 300;
                    lbl1.Text = "Label con texto";
                    lbl1.Font.Size = new FontUnit(24);
                    this.Controls.Add(lbl1);

                    this.Controls.Add(new LiteralControl("
"));
                    this.Controls.Add(new LiteralControl("
"));

                    this.Height = "200";
                }
                catch (Exception ex)
                {
                    HandleException(ex);
                }
            }
        }

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            lbl1.Text = this.BackColor.ToHex();
        }

        public override EditorPartCollection CreateEditorParts()
        {
            List<Editorpart> editor = new List<Editorpart>();
            EditorPart ep = new Blog.Webparts.WebPartCode.ColorEditor();
            ep.ID = this.ID + "_ColorEditor";
            editor.Add(ep);
            EditorPartCollection baseEditors = base.CreateEditorParts();
            return new EditorPartCollection(baseEditors, editor );
        }

        /// 
        /// Ensures that the CreateChildControls() is called before events.
        /// Use CreateChildControls() to create your controls.
        /// 
        protected override void OnLoad(EventArgs e)
        {
            if (!_error)
            {
                try
                {
                    base.OnLoad(e);
                    this.EnsureChildControls();
                    ScriptManager sm = ScriptManager.GetCurrent(this.Page);
                    if (sm == null)
                    {
                        sm = new ScriptManager();
                        this.Controls.AddAt(0,sm);
                    }
                }
                catch (Exception ex)
                {
                    HandleException(ex);
                }
            }
        }

        /// 
        /// Clear all child controls and add an error message for display.
        /// 
        private void HandleException(Exception ex)
        {
            this._error = true;
            this.Controls.Clear();
            this.Controls.Add(new LiteralControl(ex.Message));
        }
    }
}

De aquí pueden descargar el codigo completo

Happy Coding!


jueves 27 de agosto de 2009

Screenshot de cualquier elemento en Silverlight 3

Una forma sencilla de obtener un screenshot de casi cualquier elemento dentro de un objeto Silverlight, es utilizar la clase WriteableBitmap, y usar el método Render que recibe como parámetro un objeto que derive de UIElement, es por eso que virtualmente se le puede sacar la instantánea a cualquier elemento, con unas pocas líneas de código, como las siguientes: 

public Image GetImageFromUIElement(UIElement uiElement) 
{ 
       WriteableBitmap bm = new WriteableBitmap((int)uiElement.RenderSize.Width, (int)uiElement.RenderSize.Height); 
       bm.Render(container, new MatrixTransform()); 
       bm.Invalidate(); 
       Image im = new Image(); 
       im.Source = bm; 
       return im; 
}
La clase WriteableBitmap, puede ser usada como fuente de datos para un objeto Image y asi mostrarlo en pantalla o guardarlo en un archivo.Se me ocurren algunas interesantes aplicaciones como:
  1.  Un método Helper para guardar instantáneas de tu aplicación, en el momento exacto en que truena ocurre un fallo inesperado y asi complementar las explicaciones de los usuarios, tales como, “La aplicación falló cuando la estaba utilizando”
  2. Obtener thumbnails de Videos.
  3. Etc.
Espero encuentren un buen uso a esta clase y me pasen el tip 


Happy Coding! 

jueves 20 de agosto de 2009

SharePoint Services Site Top Navigation DSL

Sin lugar a dudas un excelente lugar para encontrar proyectos muy buenos y útiles es el Visual Studio Gallery, en el cual podemos encontrar una gran cantidad de addins para VS, algunos totalmente free y otros que tienen un costo.

Por ejemplo el SharePoint Services Site Top Navigation DSL, el cual nos permite modelar la barra de navegación de sitios, recordemos que por default WSS solo despliega un nivel del menú.

Si necesitamos lograr algo como esto:

 

 

 

clip_image002
Primero debemos modificar la Master Page para permitir que se despliegue más de un nivel del menú, como lo explica este artículo.


Acto seguido, utilizamos esta herramienta para modelar el menú en Visual Studio. Al final del modelado, esta herramienta creará un script de PowerShell, que deberemos ejecutar en el servidor de WSS, con permisos de administrador obviamente.

clip_image003

Espero que se den una vuelta por el Visual Studio Gallery.

Happy Coding!

miércoles 19 de agosto de 2009

Parámetro Windowless del objeto Silverlight

Un problema que ocurre con mucha frecuencia al personalizar SharePoint, sobre todo los menús. Es, que si tenemos objetos Silverlight dentro de la pagina,  los menus aparecen por debajo de los objetos Silverlight, lo cual es un error fácil de solucionar.

Solo se debe establecer el parámetro Windowless a true, y automagicamente el problema estará resuelto. El parámetro se puede establecer de diferentes maneras:


<
object id="xamlHost0" width="900" height="412" type="application/x-silverlight">
   
<param value="transparent" name="background"/>
   
<param value="true" name="windowless"/>
   
<!-- a bunch of other params go here -->
</object>

Silverlight.createHostedObjectEx({
    source:
'Silverlight/Player/Player.xaml?v=1',
    parentElement: $get(parentId ||
"Player_SilverlightContainer"),
    id:
this._hostname,
    properties: {    width:
'900',    height: '412',
    framerate:
'24',
    version:
'1.0',
    background:
'transparent',    isWindowless: 'true'
}
 

<asp:Silverlight runat="server" ID="Silverlight1"

Height="340"

Width="320"

Windowless="true"

Source="../Xaml1.xaml"

OnPluginError="onXamlError"/>

 

<!—Inclusive, mediante javascript-->


silverlightObject.settings.Windowless = true;

 

Para el mismo problema pero con objetos Flash, he aquí un post del buen Haarón González, en el que explica la solución

 

 

lunes 15 de junio de 2009

Evento onload de la página con _spBodyOnLoadFunctionNames

 

 

 

 

 

 

 

 

 

 

 

 

Habrá muchas ocasiones en las que requeriremos ejecutar alguna función de javascript en el evento onload de nuestra página, cuando esto sucede, la primera alternativa en la que pensamos podría ser el método ClientScriptManager.RegisterStartupScript, sin embargo en el modelo de programación de SharePoint esto se logra de manera un poco diferente, debido a que si somos programadores de componentes que se ejecutaran en una página de SharePoint, la mayoría de las veces no tendremos acceso al tag <body>, que se encuentra comúnmente en la masterpage, para hacer algo así:

 

 



<body onload=”MyFunction()”>


.

…..
</body>


Y claro, podríamos pensar en hacer algo como esto, que es sintácticamente correcto:

window.onload = function() {

                              

//do Something
                          

};



Pero podríamos generar comportamiento inesperado, ya que SharePoint también utiliza este evento para ejecutar funcionas propias


<body class="body" onload="javascript:_spBodyOnLoadWrapper();">


Lo recomendable es utilizar la función _spBodyOnLoadFunctionNames.push(), para registrar todas aquellas funciones de javascript que queramos que se ejecuten en el evento onload de la página, de la siguiente forma:

<script type="text/javascript">

_spBodyOnLoadFunctionNames.push('MyFunction');

function MyFunction() {

   alert('Esta función se ejecutara en el evento onload de la  página');


                     
}

</script>

 



alert(“Happy coding!”);

viernes 3 de abril de 2009

Segundo Simposio Latinoamericano de SharePoint

El próximo 23 de abril del presente año se llevará acabo el Segundo Simposio Latinoamericano de SharePoint donde habrá platicas acerca del poderoso SharePoint, lo interesante es que se abordaran tanto temas para desarrolladores como IT Pro’s. La lista de expositores es la siguiente:

Haaron Gonzalez
Luis Du Solier
Misael Monterroca
Rodrigo Diaz
Mauricio Angulo
Hector Insua
Ruben Colomo
Tomas Hernández
Javier De Labra
Francisco Hernández
Joel Olson.



El evento tiene el simbólico costo de 250 pesos, regístrate AQUI.



Allá nos vemos.

invitacionSegundoSimposioSharePointMexico_thumb_05F64227

jueves 2 de abril de 2009

GAC versus BIN

Hace unos días, se presento la siguiente situación con dos desarrolladores (Juan Topo y Max Power)de Sharepoint, ambos estaban utilizando un componente creado por ellos, para un proyecto anterior, llameMOSSle (no pude evitarlo) Assembly1. Ahora ellos lo utilizaban para proyectos diferentes, a Juan Topo le funcionaba a las mil maravillas y a Max Power le lanzaba SecurityExceptions hasta en el web.config.


Después de los comentarios llenos de odio y reclamos al altísimo de Max Power, llegamos a la parte en la que debuggeamos visualmente©  el código que usa su componente, la forma en la que ambos estaban utilizando el componente era muy parecida y nada fuera de lo normal.

Ahora llegamos a la parte de analizar de ejecución e inspeccionar la información proporcionada por la excepción lanzada.   Efectivamente, el código lanza una excepción al momento de intentar acceder a un objeto SPWeb, pero no ofrece mucha información.

Primer pensamiento, si encierro esta operación dentro de un RunWithElevatedPrivileges, funcionará sin problemas….. Pues no.

Desktop_security_splash

 


¿Entonces cual es la diferencia en sus dos implementaciones?

Después de un rato recopilando información, me doy cuenta que Juan Topo agrego su Assembly1 al GAC y Max Power al directorio BIN de su aplicación. He ahí la respuesta, cualquier assembly agregado al GAC se ejecuta con Full Trust, por otro lado, cualquier  assembly agregado al directorio bin de una web application de SharePoint se ejecuta dentro del contexto de seguridad establecido por el CAS policy local.

Entonces la solución es que Max debe agregar su assembly a la GAC?

 

La respuesta depende de las necesidades, en la mayoría de los casos, no es conveniente agregar el Assembly1 a la GAC, ya que este se salta el CAS policy y por lo tanto adquiere acceso total a los recursos de la maquina, lo que puede ser un hueco de seguridad. Sin embargo existen algunas consideraciones que podemos tomar en cuenta al tomar esta decisión:

1.       Si se trata de un Assembly de Webparts, lo recomendable es que sea despegado en el directorio BIN de tu web application, para asegurate que el código de las webparts solo accedan a recursos sobre los que se les ha dado permisos explícitos.

2.       Si tienes una o más webparts que requieren un conjunto de permisos superior al de otras, es recomendable que compiles estas webparts en un assembly separado y asignes permisos específicos a este ensamblado, en lugar poner todas tus webparts en un assembly y asignar permisos elevados a este.

3.       Si tienes un ensamblado que requiere un nivel de confianza (level trust) mayor, no intentes subir subas el nivel de seguridad local, porque esto subirá automáticamente el nivel confianza de todos los ensamblados que se ejecutan con ese nivel, en lugar de esto, asigna permisos especifico al assembly.

4.       Pero qué pasa con los elementos de SharePoint que requieren ser desplegados en la GAC? Por ejemplo, los event receivers y las features?.Si tienes mezclados este tipo de componentes con webparts dentro de tu solución de SharePoint, debes compila tus webparts en un assembly aparte para que puedan ser desplegados en el folder BIN.

5.       Los administradores de SharePoint son como perros bull terry, y no permitirán que despliegues assemblies en la GAC, solo porque les digas que está firmado, debes habilitarlos para desplegar dentro del folder BIN de sus aplicaciones, si tienes alguna webpart que requiera de mas permisos, debes otorgárselos explícitamente a través de WSS_Minimal trust.



Es importante tener en cuenta esto para construir código seguro por defecto.

Happy Coding!

miércoles 25 de marzo de 2009

Nuevas Características en Silverlight 3 Beta 1

Sin lugar a dudas uno de los huecos mas grandes de Silvelight 2.0 es la integración con servicios web, restricciones tales como basicHttpBinding, hacían la vida de un desarrollador  menos divertida. Como sabemos el basicHttpBinding codifca los mensajes de respuesta como texto, lo cual es grandioso si uno de los alcances de nuestro proyecto es la interoperabilidad  con SOAP 1.1 pero nefasto por la sobrecarga de información que se envía en la respuesta. Cuantos desarrolladores no dedicamos tiempo creando alguna forma para que la respuesta de un servicio web se redujera de tamaño?



Y he aquí una de las características, por la que rezaba todas las noches,  que mas esperaba de la versión Beta 1 que fue anunciada en el pasado mix.




Binary Message Encoding


BinaryHttpBinding es la respuesta que Silverlight 3 trae a los desarrolladores, para reducir el overhead que se tenía en la codificación a texto.  Este nuevo tipo de binding es, por alguna razón, implementado como un custom binding.



<bindings>


  <customBinding>

    <binding name="binaryHttpBinding">

      <binaryMessageEncoding />

      <httpTransport />

    </binding>

  </customBinding>

</bindings>

<endpoint address="" binding="customBinding" bindingConfiguration="binaryHttpBinding"  contract="ServiceContract" />

El gran incremento en performance que trae este nuevo tipo de binding, seguramente repercutirá en su utilización como default binding, y relegaremos el basicHttpBinding en los escenarios en los que sea obligatorio la interoperabilidad.

 


Un modo  de seguridad adicional

Silverlight 3 introduce un nuevo modo de seguridad, que ya conocíamos al utilizar otros clientes  con WCF, TransportWithMessageCredential es casi la respuesta a nuestras plegarias, ya que nos permite enviar credenciales para autentificarnos con el servicio  web que estamos consumiendo. La desventaja (porque siempre hay un “pero”?), es que las credenciales que enviemos para la autentificación, serán enviadas en cada mensaje, y el servicio validara las credenciales en una capa SOAP. Por lo anterior las credenciales viajaran en texto plano, por lo que será necesario utilizar HTTPS

<security mode="TransportWithMessageCredential">


SLsvcutil.exe

Por ultimo, aunque no menos  importante, quiero hacer mención de la herramienta SLsvcutil.exe, que podremos utilizar desde la línea de comandos, la cual nos permitirá crear las clases proxy, para realizar peticiones a los servicios web. Recordemos que en la versión anterior de Silverlight solo podíamos hacer esto a través de  Visual Studio | Add Service Reference. 

Aquí pueden encontrar la documentación para utilizar esta herramienta.


Happy Coding!

martes 27 de enero de 2009

Evitar que Visual Studio 2010 CTP expire

 

Después del maratón Guadalupe-Reyes, algunos hemos querido retomar nuestros primeros pasos en el CTP de Visual Studio 2010, encontrándonos con que esta versión ya expiró.



image_thumb_5


 

 

 

 


Sin embargo, es muy fácil darle la vuelta a este pequeño obstáculo. Solo tenemos que hacer lo siguiente:

 

Abrir el archivo de configuración de la maquina virtual (Virtual Machine Settings File) en Notepad



image



 

 

Y agregar la siguiente sección (que esta en rojo), exactamente debajo de la sección de configuración del mouse.

<integration>
        <microsoft>
            <mouse>
                <allow type="boolean">true</allow>
            </mouse>
           <components>
                <host_time_sync>
                    <enabled type="boolean">false</enabled>
                </host_time_sync>
            </components>

 

 

 

 

 

 

 



Bueno, espero que esto ayude a que sigan jugando con la VM de Visual Studio 2010 CTP, que por cierto pueden descargar de aquí.