Où est mon client sessionID ?

viclient_sessionid_feat

On est tombé sur quelque chose d’intéressant lors d’un test sur le développement d’un plugin Web pour vCenter. Pour le coup, on abandonne le C# pur vu que la méthode API C# est devenue obsolète comme en témoigne la documentation sur le VC-SDK disponible ici : http://www.vmware.com/support/developer/vc-sdk/vcplugin/

This plug-in style is deprecated. In the future, the C# API will not be used by VMware products

En se basant sur la documentation (documentation valable pour vSphere 4.1 et 5.0) pour les plugins pour vCenter disponible sur http://www.vmware.com/support/developer/vc-sdk/vcplugin/vSphere_Plugin_4_1_Technote.pdf , on a fait quelques tests afin de mieux cerner le fonctionnement de cette architecture.

Pour le principe, rien de plus simple, lorsqu’on accède à un plugin depuis le client vSphere, une URL lui est transmise avec tout plein de paramètres que l’on peut réutiliser dans le plugin, comme par exemple :

  • sessionId = identifiant permettant de réutiliser le jeton de sécurité de l’utilisateur courant pour l’exécution d’action
  • moref = permet d’identifier l’objet sélectionné lors de l’activation du plugin
  • serviceUrl = accès aux WebServices du vCenter, typiquement https://serverFQDN/sdk

Pour notre exemple, on voulait juste afficher le contenu de toutes les variables transmises au plugin afin de voir ce que l’on pouvait faire lorsqu’on s’est rendu compte de quelque chose.

Voici juste le plugin de base utilisé pour l’exemple, il est composé du fichier de définition XML pour le client vSphere ainsi que d’un fichier ASP.NET et de son code C# :

<scriptConfiguration version="4.0">
	<key>vmdude</key>
	<description>vmdude Sample vSphere Client Plug-in</description>
	<name>vmdude Plug-in</name>
	<vendor>vmdude.fr</vendor>
	<multiVCsupported>false</multiVCsupported>
	<extension parent="InventoryView.VirtualMachine">
		<title locale="en">vmdude debug</title>
		<url display="window">http://localhost/index.aspx</url>
	</extension>
</scriptConfiguration>

Ce fichier xml doit être mis dans le dossier Plugins du viclient, typiquement dans

C:\Program Files (x86)\VMware\Infrastructure\Virtual Infrastructure Client\Plugins

La partie <extension parent= »InventoryView.VirtualMachine »> détermine l’endroit ou le plugin sera actif, ici ce sera un onglet supplémentaire lors de la sélection d’une VM :

Lors de l’activation du plugin, la page http://localhost/index.aspx sera appelée, celle-ci ne faisant qu’afficher les valeurs de certains paramètres :

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs" Inherits="vmdudedebug.index" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <script type="text/javascript">
        function refresh() {
            window.location.reload();
        }
    </script>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <p>URL : <asp:label id="txt_URL" runat="server" /></p>
        <p>MoRef : <asp:label id="txt_moref" runat="server" /></p>
        <p>Type : <asp:label id="txt_type" runat="server" /></p>
        <p>Value : <asp:label id="txt_value" runat="server" /></p>
        <p>sessionId : <asp:label id="txt_sessionId" runat="server" /></p>
        <p>serverGuid : <asp:label id="txt_serverGuid" runat="server" /></p>
        <p>locale : <asp:label id="txt_locale" runat="server" /></p>
        <p>webServicesSessionId : <asp:label id="txt_wsSessionId" runat="server" /></p>
        <p>serviceUrl : <asp:label id="txt_serviceUrl" runat="server" /></p>
    </div>
    <button onclick='refresh();'>Refresh Da Page !</button>
    </form>
</body>
</html>

Et le code C# de cette page (qui ne fait que décomposer l’URL reçue et renseigner les différentes valeurs) :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace vmdudedebug
{
    public partial class index : System.Web.UI.Page
    {
        public static string MOREF = "moref";
        public static string SESSION_ID = "sessionId";
        public static string SERVER_GUID = "serverGuid";
        public static string SERVICE_URL = "serviceUrl";
        public static string LOCALE = "locale";
        public static string WS_SESSION_ID = "webServicesSessionId";
        public static char[] splitter = { ':' };

        protected void Page_Load(object sender, EventArgs e)
        {
            Uri SvcURL = new Uri(Request.Url.ToString());
            string MoRefArg = HttpUtility.ParseQueryString(SvcURL.Query).Get(MOREF);
            string typeMoRef = MoRefArg.Split(splitter)[0];
            string valueMoRef = MoRefArg.Split(splitter)[1];
            string session_ID = HttpUtility.ParseQueryString(SvcURL.Query).Get(SESSION_ID);
            string server_GUID = HttpUtility.ParseQueryString(SvcURL.Query).Get(SERVER_GUID);
            string serviceUrl = HttpUtility.ParseQueryString(SvcURL.Query).Get(SERVICE_URL);
            string locale = HttpUtility.ParseQueryString(SvcURL.Query).Get(LOCALE);
            string webServicesSessionId = HttpUtility.ParseQueryString(SvcURL.Query).Get(WS_SESSION_ID);

            txt_URL.Text = SvcURL.ToString();
            txt_moref.Text = MoRefArg;
            txt_type.Text = typeMoRef;
            txt_sessionId.Text = session_ID;
            txt_serverGuid.Text = server_GUID;
            txt_value.Text = valueMoRef;
            txt_locale.Text = locale;
            txt_serviceUrl.Text = serviceUrl;
            txt_wsSessionId.Text = webServicesSessionId;
        }
    }
}

Le problème que l’on a eu (puisque c’est quand même ça le but du billet) est que certaines valeurs n’étaient pas retransmise.

La règle du RTFM s’appliquant partout, c’est toujours dans la documentation sur les plugins que l’on trouve l’explication :

supportNonSecureCommunication > Optional. For non‐secure HTTP connections between the vSphere Client and and the plug‐in Web server that is identified by the url element of an extension element. See the description of the url element below. When the vSphere Client establishes a secure connection to a plug‐in Web server, the Client will pass sessionId and webServicesSessionId values in the HTTPS request. If the extension element specifies a standard HTTP connection, by default the vSphere Client does not pass the session identifiers to the plug‐in server. To include session identifiers in a standard HTTP request, use the following statement in your configuration file.
<supportNonSecureCommunication>true</supportNonSecureCommunication>

Pour que les éléments sessionId et webServicesSessionId soient communiqués via l’URL, il faut rajouter <supportNonSecureCommunication>true</supportNonSecureCommunication> au fichier XML de définition du plugin, et là ça marche !

<scriptConfiguration version="4.0">
	<key>vmdude</key>
	<description>vmdude Sample vSphere Client Plug-in</description>
	<name>vmdude Plug-in</name>
	<vendor>vmdude.fr</vendor>
	<multiVCsupported>false</multiVCsupported>
	<extension parent="InventoryView.VirtualMachine">
		<title locale="en">vmdude debug</title>
		<url display="window">http://localhost/index.aspx</url>
		<supportNonSecureCommunication>true</supportNonSecureCommunication>
	</extension>
</scriptConfiguration>

Moralité, on le dira jamais assez :

Post also available in : Anglais

2 comments

Laisser un commentaire

Required fields are marked *.

*