Accueil > WCF, WCF Data Services > Limiter l’accès d’un service web WCF à un ou plusieurs types d’appareils

Limiter l’accès d’un service web WCF à un ou plusieurs types d’appareils

Dans certaines situations, nous pourrions avoir besoin de limiter l’accés d’un service web à un type d’appareil donné (Ex : l’accés ne sera autorisé que pour les utilisateurs d’Iphone).
Dans ce billet je vais montrer comment mettre cela en place avec un service web WCF hébergé par une application web.

Prenons comme un cas pratique simple : l’accès à notre service ne sera possible que les périphériques mobiles utisant le système IPhone ou Windows Phone.

Comment via notre service WCF allons-nous récupérer les infos sur le système utilisé par le client ?
Réponse : cela est possible grâce à la proprieté UserAgent de la requête entrante.
Pour accéder à cette propriété rien de plus simple : HttpContext.Current.Request.UserAgent. Cette propriété renvoie une chaine de caractère contenant l’information sur le système utilisé par l’utilisateur ;).
Ainsi nous pouvons alors créer la fonction GetUserOS qui renvoie un enum UserOS qui correspond à l’OS utilisé 😀

public enum UserOS
{
	Windows,
	Mac,
	IPhone,
	WindowsPhone,
	Linux,
	FreeBSD,
	SunOS,
	TRIX,
	BeOS,
	OS2,
	AIX, 
	Other
}

public UserOS GetUserOs()
{
	string userAgent = HttpContext.Current.Request.UserAgent.ToLower();
	if (userAgent.Contains("windows phone")) return UserOS.WindowsPhone;
	else if (userAgent.Contains("win")) return UserOS.Windows;
	else if (userAgent.Contains("mac")) return UserOS.Mac;
	else if (userAgent.Contains("iphone")) return UserOS.IPhone;
	else if (userAgent.Contains("linux")) return UserOS.Linux;
	else if (userAgent.Contains("freebsd")) return UserOS.FreeBSD;
	else if (userAgent.Contains("sunos")) return UserOS.SunOS;
	else if (userAgent.Contains("trix")) return UserOS.TRIX;
	else if (userAgent.Contains("beos")) return UserOS.BeOS;
	else if (userAgent.Contains("os/2")) return UserOS.OS2;
	else if (userAgent.Contains("aix")) return UserOS.AIX;
	return UserOS.Other;
}
	

Nota Béné : Comme vous pouvez le voir on utilise le contexte HTTP, donc pour que HttpContext.Current ne renvoie pas null il faut que notre service soit hébergé dans un serveur web tel que IIS ou WAS.

Cette méthode peut être utilisée à divers endroit de notre application web où il est possible d’intercepter les requêtes, on peut par exemple s’abonner à l’évènement BeginRequest et décider de ce qu’on veut faire :

// Dans le gestionnaire de l'évènement BeginRequest de l'application
protected void Application_BeginRequest(object sender, EventArgs e)
{
	UserOS userOS = this.GetUserOs();
	List<UserOS> authorizedOS = new List<UserOS> { UserOS.IPhone, UserOS.WindowsPhone };
	if (authorizedOS.Exists(os => os == userOS))
	{
		HttpContext.Current.Response.Write("Le service n'est limité qu'aux utilisateurs d'IPhone");
		HttpContext.Current.Response.End();
	}
}

Dans le code ci-dessus j’ai géré l’évènement BeginRequest de l’application web (dans le cas d’un service WCF Data Services, la redéfinition de la méthode protégée OnStartProcessingRequest est plus élégante et joue le même rôle que la gestion de l’évènement BeginRequest).
Cette méthode permet de centraliser la gestion de l’accès mais rien ne vous empêche de créer une méthode qui se chargera de vérfier l’accés et d’appeler celle-ci avant le début de chaque opération de votre service WCF (cette méthode doit être privilégiée si certaines opérations doivent être accessible par tous les OS et d’autres non ;)).

Nota Béné : Pour récupérer l’OS utilisé nous utilisons la chaîne de caractère USER AGENT envoyée à notre serveur mais il se trouve que certains navigateurs tels que FireFox permettent à l’utilisateur de changer cette chaîne :(. Donc tout cela pour dire que cette manière de limiter l’accès d’un service à un ensemble de périphérique n’est pas fiable à 100%.

Publicités
Catégories :WCF, WCF Data Services Étiquettes : , ,
  1. Aucun commentaire pour l’instant.
  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :