Depuis Exchange 2007, il est possible de vérifier les DeviceID des périphériques mobiles afin d'autoriser ou non la connexion. Ceci avait pour effet de limiter les synchro ActiveSync uniquement pour les périphériques connus de l'entreprise. Mais Quid avec une infra Exchange 2003 ? Et si on trouver une solution pour faire cette vérification sur la bordure externe avant de pénétrer le réseau interne ? …
Nous allons donc expliquer à travers ce billet, comment effectuer une authentification et une vérification des DeviceId directement en externe avec IAG 2007.
Tout d'abord on va créer un portail de type webmail avec ActiveSync et suivre l'assistant normalement. Je ferais plus tard un article plus complet sur la configuration ActiveSync J
Pour avoir plus d'infos sur la publication ActiveSync pour l'instant se rendre sur le Blog IAG Edge Access :
Cependant, je déconseille de modifier directement le fichier ActiveSyncLogin.asp décrit dans l'étape 9 du premier lien car, si une mise à jour IAG devait être effectuée. Cette modification sera remplacée par un nouveau fichier. La connexion ne se fera donc plus. Je préconise l'utilisation d'un fichier Hook qui ne sera pas affecté par les mises à jour IAG.
Cette modification consiste à créer un fichier <%TRUNK_NAME%><0/1>ActiveSyncLoginStart.inc dans le dossier \whale-com\e-gap\von\InternalSite\CustomUpdate. Le nom du fichier devra être changé en fonction du nom du portail et du type de publication (http ou https). Si le portail est en http il faudra mettre 0, et si en SSL ce sera 1. Concernant le nom du portail c'est celui que l'on indique lors de sa création
. Donc si j'ai un portail SSL qui a pour nom ACTIVESYNC, le fichier aura pour nom « activesync1ActiveSyncLoginStart.inc » !
Par exemple si nous avions choisi « ADCERT » comme nom de fournisseur d'authentification
Alors nous rajouterons <% repository = "ADCERT" %> dans le fichier <%TRUNK_NAME%>1ActiveSyncLoginStart.asp
A présent la connexion ActiveSync devrait fonctionner depuis un mobile correctement configuré !
Maintenant le but du jeu est de permettre de vérifier le DeviceID, lors de la connexion ActiveSync, afin de vérifier si le périphérique est autorisé. Dans les exemples que je vais donner ci-après, nous allons utiliser une base de données de type texte mais cela peut-être améliorer très largement. On pourrait par exemple directement requête un champ ActiveDirectory, une base SQL, Exchange 2007, …
Si l'utilisateur n'a pas le DeviceID de renseigner dans la base correspondant il peut obtenir un message personnalisé
Le script expliqué plus loin consistera à créer deux fichiers de logs dans le dossier C:\Whale-Com\e-Gap\von\InternalSite\inc\CustomUpdate\ACTIVESYNC. Le dossier et les fichiers seront crées automatiquement en cas d'absence.
- activesync_database.txt : Ce fichier contiendra les numéros de DeviceID autorisé à se connecter. Le fichier sera tabulé avec un DeviceID par ligne.
- activesync_error.txt : Ce fichier contiendra les informations de connexions échouées. Il permettra à l'administrateur voulant autoriser un nouveau périphérique de s'aider de ce fichier pour faire un copier/coller vers le fichier de base de données. Et oui l'informatique c'est bien pour les feignants J !
Ensuite il nous faut trouver les informations de DeviceId et autres informations éventuelles. Il faut savoir que lors d'une connexion ActiveSync, le mobile présente de nombreuses informations dans la requête http à l'aide de valeurs GET. Analysons dont une trame :
Lors de la connexion, nous allons récupérer les éléments à l'aide de la chaine url. Cependant si nous utilisons des requêtes de type Request.ServerVariables( "ALL_HTTP" ), nous ne verrons que la requête proxifiée d'IAG et non la requête initiale. Mais IAG utilise une variable «orig_url » qui est la chaine de l'url initiale effectuée par le client. En splittant les différents éléments, il sera donc possible de récupérer les variables user, DeviceId, DeviceType, etc…
Inutile d'en dire plus, voilà le code à utiliser. Le code est assez documenté et de nombreuses traces afin de pouvoir troobleshooter facilement. N'hésitez pas à me contacter.
|
<% ' GIRAUD Alexandre Custom ActiveSync Start repository = "ADCERT"
' Informations sur la requête SSL LIGHT_TRACE "TRACE ActiveSync orig_url:["& orig_url &"]" LIGHT_TRACE "TRACE ActiveSync ALL_HTTP:["& Request.ServerVariables( "ALL_HTTP" ) &"]" LIGHT_TRACE "TRACE ActiveSync QUERY_STRING:["& Request.ServerVariables( "QUERY_STRING" ) &"]" LIGHT_TRACE "TRACE ActiveSync URL:["& Request.ServerVariables( "URL" ) &"]"
' Récupération du DeviceId LIGHT_TRACE "TRACE ActiveSync : Début Script Get DeviceId" n = 0 variables_url = Split(orig_url,"?") variables_unique = Split(variables_url(1),"&") For Each Item in variables_unique variable_string = Split(variables_unique(n),"=") Select Case variable_string(0) Case "User": LIGHT_TRACE "TRACE ActiveSync User:["& variable_string(1) &"]" user = variable_string(1) Case "DeviceId": LIGHT_TRACE "TRACE ActiveSync DeviceId:["& variable_string(1) &"]" DeviceId = variable_string(1) Case "DeviceType": LIGHT_TRACE "TRACE ActiveSync DeviceType:["& variable_string(1) &"]" DeviceType = variable_string(1) Case Else LIGHT_TRACE "TRACE ActiveSync "& variable_string(0) &":["& variable_string(1) &"]" End Select n = n + 1 Next set n = nothing LIGHT_TRACE "TRACE ActiveSync : Fin Script DeviceId"
' Recherche et comparaison DeviceId LIGHT_TRACE "TRACE ActiveSync : Début script comparaison DeviceId" dim fs,errorlog,database,find set fs=Server.CreateObject("Scripting.FileSystemObject") if fs.FolderExists("C:\Whale-Com\e-Gap\von\InternalSite\inc\CustomUpdate\ACTIVESYNC") = false then fs.CreateFolder("C:\Whale-Com\e-Gap\von\InternalSite\inc\CustomUpdate\ACTIVESYNC") LIGHT_TRACE "TRACE ActiveSync : Création du dossier ACTIVESYNC" else LIGHT_TRACE "TRACE ActiveSync : Le dossier ACTIVESYNC existe déjà" end if if fs.FileExists("C:\Whale-Com\e-Gap\von\InternalSite\inc\CustomUpdate\ACTIVESYNC\activesync_error.txt") = false then set errorlog=fs.CreateTextFile("C:\Whale-Com\e-Gap\von\InternalSite\inc\CustomUpdate\ACTIVESYNC\activesync_error.txt",false) LIGHT_TRACE "TRACE ActiveSync : Création du fichier d'erreur ActiveSync" else LIGHT_TRACE "TRACE ActiveSync : Le fichier d'erreur ActiveSync existe déjà" end if if fs.FileExists("C:\Whale-Com\e-Gap\von\InternalSite\inc\CustomUpdate\ACTIVESYNC\activesync_database.txt") = false then set database=fs.CreateTextFile("C:\Whale-Com\e-Gap\von\InternalSite\inc\CustomUpdate\ACTIVESYNC\activesync_database.txt",false) LIGHT_TRACE "TRACE ActiveSync : Création du fichier de base de données DeviceID" else LIGHT_TRACE "TRACE ActiveSync : Le fichier de base de données DeviceId existe déjà" end if
' Vérification des DeviceId par recherche dans la DB LIGHT_TRACE "TRACE ActiveSync : Lecture du fichier de base de données" set database=fs.OpenTextFile("C:\Whale-Com\e-Gap\von\InternalSite\inc\CustomUpdate\ACTIVESYNC\activesync_database.txt",1) find = 0 LIGHT_TRACE "TRACE ActiveSync : Lecture ligne / ligne pour comparaison" Do until database.AtEndOfStream line = database.ReadLine DeviceId_search = Split(line,vbTab) if DeviceId_search(0) = DeviceId then LIGHT_TRACE "TRACE ActiveSync : Le DeviceId ["& DeviceId &"] pour l'utilisateur :["& user &"] a été trouvée dans la base de données" find = 1 Exit Do else LIGHT_TRACE "TRACE ActiveSync : La comparaison de ["& DeviceId &"] a échouée avec celle en cours ["& DeviceId_search(0) &"]" end if Loop
' Si aucune correspondance n'a été trouvée alors écriture dans le fichier de log LIGHT_TRACE "TRACE ActiveSync : Vérification de l'erreur find=["& find &"]" if find = 0 then LIGHT_TRACE "TRACE ActiveSync : Aucune correspondance DeviceId trouvée" set errorlog=fs.OpenTextFile("C:\Whale-Com\e-Gap\von\InternalSite\inc\CustomUpdate\ACTIVESYNC\activesync_error.txt",8) errorlog.WriteLine(DeviceId & vbTab & user & vbTab & DeviceType & vbTab & Now) errorlog.Close set errorlog=nothing set find = nothing LIGHT_TRACE "TRACE ActiveSync : Fermeture de la session pour accès refusé" response.Write "Vous n'avez pas l'autorisation de synchroniser cet appareil.<br>Merci de contacter l'administrateur de votre entreprise" response.End end if
LIGHT_TRACE "TRACE ActiveSync : Fermeture des variables" database.Close set database = nothing set fs=nothing LIGHT_TRACE "TRACE ActiveSync : Fin Script comparaison DeviceId"
' GIRAUD Alexandre Custom ActiveSync End
%>
|