SharePoint 2013: Como generar el App Id y App Secret para una aplicación “Provider-Hosted” (I)!

El otro día os comentaba en este post las opciones que tenemos para registrar aplicaciones de tipo Autohosted y Provider-Hosted. En este primer artículo de la serie os voy a detallar como registrar una aplicación “Provider-Hosted” tanto para una instalación On-Premise de SharePoint 2013 como para un tenant de Office 365:

  • Accedemos a la siguiente página de aplicación para una cierta colección de sitios:/_layouts/15/appregnew.aspx
  • En esta página, tendremos que especificar una serie de datos obligatorios como el dominio de la aplicación y el título de la misma. Además, procederemos a generar tanto el Id. de aplicación como el Secreto de aplicación.
  • Tras pulsar “Crear”, ya tendremos la información de registro para poder utilizarla en la aplicación.
image image

Visual Studio 2012: Como resolver el problema en la creación de proyectos de base de datos que introduce SQL Server 2012 SP1!

Si cuando intentáis crear un proyecto de base de datos en Visual Studio 2012 obtienes un error de incompatibilidad relativo a problemas de incompatibilidad con la versión de SQL Server 2012, es muy probable que sea debido a un problema qué introduce en las mismas la instalación del SP1 de SQL Server 2012. Para solucionarlo, os cuento los pasos que seguí:

image image image
    • Tras instalar la versión correcta de las Data Tools, podréis comprobar que se pueden crear proyectos de bases de datos en Visual Studio 2012.

image

SharePoint: Como bloquear el acceso a ciertos servicios web!

Cómo sabéis, SharePoint dispone de una fachada de servicios web pensada para permitir interactuar de forma remota con elementos y servicios de la plataforma. Aunque el acceso a dichos servicios dispone de los mismos mecanismos de seguridad que el acceso a través del navegador, en ocasiones puede ser que se nos pida como requerimiento, sobre todo para sitios Internet, qué se quiere vetar todo acceso anónimo a dichos servicios. ¿Qué posibilidades tenemos para conseguirlo? Pues por suerte varias como las que siguen:

Estas son las opciones que se me han ocurrido a bote pronto y seguro que hay alguna más :-).

SharePoint Online: ¿Cómo quito aplicaciones qué he agregado en mi tenant?

Si se ha agregado una aplicación del Office Store en una colección de sitios del tenant de Office 365, esta aplicación podrá ser agregada en cualquier otra colección de sitios del tenant. Si queremos que una cierta aplicación, una vez quitada de todas las colecciones, no se pueda agregar más tendremos qué realizar los siguientes pasos en la Administración de SharePoint Online en Office 365:

  • Acceder a la sección Aplicaciones y hacer clic sobre “Administrar aplicaciones”.
  • A continuación se muestra el listado de aplicaciones disponibles. Pulsamos sobre la aplicación que queremos quitar.
  • En la página de detalle de la aplicación, simplemente desplegamos las opciones disponibles en ACCIONES y pulsamos sobre “Quitar esta licencia” de manera que automáticamente la aplicación deja de estar disponible para agregar en las Colecciones de Sitios de SharePoint Online en Office 365.
image image image

Office 2013: ¿Cómo funciona una App de contenido cuando comparto mi documento Excel?

A punto de comenzar el Office & SharePoint App Challenge, me preguntaban los compañeros del CIP esta tarde qué pasa si yo comparto un documento Excel en el qué estoy utilizando una aplicación con otra persona…lo primero qué pensé es qué, independientemente de si la aplicación se “comparte” o no entre usuarios es claro que si el destinatario no ha iniciado como mínimo sesión con un LiveID, no va a poder usar esta aplicación. De echo, esto es lo que sucede y aquí va la prueba del algodón:

  • Supongamos que tenemos un documento Excel con datos que estoy visualizando en un par de aplicaciones de tipo contenido como la de Bubles y la de Heap Map.
  • Si este Excel lo compartimos con otro usuario, veremos que las aplicaciones no están operativas y qué para poder utilizarlas es necesario iniciar sesión con un Live ID en la tienda de Office.
  • Hacemos por lo tanto un inicio de sesión con un Live Id diferente al utilizado para abrir el documento Excel con las aplicaciones operativas.
image image image
  • Una vez iniciada sesión, el estado de la aplicación sigue siendo que no se puede iniciar. Pero ahora, el mensaje cambia y se muestra un panel informativo, que tras pulsar “Iniciar”, nos permite utilizar la aplicación.
  • Este proceso tendremos que repetirlo por cada aplicación disponible en el documento.
  • Además, si agregamos una aplicación nueva al documento Excel podremos comprobar como se interpreta qué las aplicaciones ya existentes en el mismo entran a formar parte del conjunto de aplicaciones de Office qué el usuario puede agregar independientemente de qué en origen fuese otro usuario quién las añadió
image image image
Por lo tanto, la moraleja es qué podremos tener una experiencia completa de uso del documento con las aplicaciones siempre y cuando iniciemos sesión con un LiveID. Esto lo he comprobado para aplicaciones gratuitas. La prueba para aplicaciones de pago lo dejo para otro post 😉

SharePoint 2013: Políticas de validación de aplicaciones enviadas al Office Store!

Una duda qué tendrá todo aquel que quiera publicar aplicaciones para Office y SharePoint en el Office Store es la relativa a aquellos aspectos que Microsoft va a tener en cuenta a la hora de validar si una aplicación está lista para publicar o no. Para conocer estos aspectos, o más bien políticas de validación, os recomiendo revisar los siguientes enlaces:

image

SharePoint 2013: Novedades en manejadores de eventos (II)!

Como continuación del post qué escribí hace tiempo en relación a las novedades en manejadores de eventos para SharePoint 2013, en este nuevo artículo quería explicar como quedaría el trabajo con dichos manejadores tanto para SharePoint 2013 RTM como para SharePoint Online en Office 365. Al lío pues:

using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Net;

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

  • A continuación, procederemos a codificar los dos métodos del servicio qué nos permiten responder a eventos de naturaleza síncrona (ing) y asíncrona(ed). Para los eventos síncronos, tenemos que codificar el método ProcessEvent siguiendo por ejemplo el primer post de la serie.
  • En cambio, para los eventos asíncronos tendremos que codificar el método ProcessOneWayEvent de acuerdo al siguiente fragmento de código:
            HttpRequestMessageProperty requestProperty =
                (HttpRequestMessageProperty)OperationContext.Current.IncomingMessageProperties[HttpRequestMessageProperty.Name];
            string contextTokenString = 
                requestProperty.Headers["X-SP-ContextToken"];
 
            // If there is a valid token, continue. 
            if (contextTokenString != null)
            {
                SharePointContextToken contextToken =
                    TokenHelper.ReadAndValidateContextToken(
                        contextTokenString, requestProperty.Headers[HttpRequestHeader.Host]);
                Uri sharepointUrl =
                new Uri(properties.ItemEventProperties.WebUrl);
                string accessToken =
                TokenHelper.GetAccessToken(contextToken, sharepointUrl.Authority).AccessToken;
                using (ClientContext ctx = 
                    TokenHelper.GetClientContextWithAccessToken(sharepointUrl.ToString(), accessToken))
                {
                    if (properties.EventType == SPRemoteEventType.ItemAdded)
                    {
                        List lList =
                            ctx.Web.Lists.GetByTitle(
                                properties.ItemEventProperties.ListTitle);
                        ctx.Load(lList);
                        ListItem liItem =
                            lList.GetItemById(
                                properties.ItemEventProperties.ListItemId);
                        ctx.Load(liItem);
                        ctx.ExecuteQuery();
                        liItem["Title"] +=
                            " - Elemento Añadido";
 
                        liItem.Update();
                        ctx.ExecuteQuery();
                    }
                }
            }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

  • Cómo veis, frente al primer artículo de la serie basado en la versión Preview de SharePoint 2013, en este caso hacemos uso de la clase TokenHelper proporcionada al crear el proyecto de aplicación qué nos da las clases y métodos necesarios para poder interactuar de vuelta con SharePoint mediante OAuth dado qué en este caso estamos actualizando información del elemento de lista que se ha añadido. Fijaros en la mecánica a seguir:
    • En primer lugar, al realizar una petición a SharePoint desde una aplicación (en este caso desde el servicio WCF qué implementa la lógica del manejador de eventos remoto), necesitamos disponer de un Token de Contexto qué es generado por ACS (Azure Token Service).
    • Con el Token de contexto disponible, estamos en disposición de poder hacer operaciones “de vuelta” (callback) contra SharePoint para lo que necesitamos disponer de un Token de Acceso. Fijaros en como este Token de Acceso es obtenido por la aplicación partiendo del Token de Contexto y de nuevo a través de ACS.
    • Con el Token de Acceso, ya podemos crear una instancia de ClientContext y empezar a interactuar con SharePoint.
  • Dicho esto, ya sólo queda comenzar a probar el manejador de eventos remoto y verificar que funciona de forma correcta.

image

Referencia: http://code.msdn.microsoft.com/office/SharePoint-2013-Use-event-8b5a551f/sourcecode?fileId=72211&pathId=989899932