Authentification ACS: Redirection et passage de paramètres
Si vous avez déjà mis en place l’authentification avec ACS sur un de vos projet, vous avez peut-être comme moi été confronté au problème suivant: si mon utilisateur arrive sur le site et tente d’accéder à une page qui requiert d’être authentifiée et qu’il ne l’est pas encore, celui-ci est redirigé vers le service d’authentification ACS.
Jusque-là tout va bien mais une fois authentifié il est redirigé vers la page définie en tant que returnUrl dans le portail Azure. Dans mon cas mes utilisateur tentais d’accéder directement à une url avec paramètres en scannant un QR code et j’ai donc commencé à chercher une solution pour transmettre ces paramètres à mon site à travers de l’authentification ACS afin de le traiter directement au retour sur le site.
Après un temps de recherche, je trouve principalement des réponses préconisant l’utilisation du paramètre WCTX de la login URL des providers utilisés. Ce dernier est censé être utilisé justement pour faire transiter des informations qui seront alors retranscrises tel quel par ACS à la return URL.
Le problème est que l’on recoit le contenu de ce paramètre encrypté et qu’il est alors très compliqué d’y ajouter des informations… On oublie donc cette solution!!
La meilleure solution m’a en fait été soufflée par Léonard et est beaucoup plus simple et n’est pas pourtant documentée! Il est en effet possible de modififer l’URL de retour transmise par ACS en fonction de l’action demandée par l’utilisateur et ce ci très simplement:
Sur le portail de connexion d’Azure > Bus de service, contrôle d’accès et cache > Contrôle d’accès. Ensuite, dans la configuration de votre Applications par partie de confiance: Définir l’url de retour à la racine de votre site par défaut.

Toujours dans le portail de configuration du contrôle d’accès, dans la partie Intégration de l’application récupérez l’URL du JSON permettant de récupérer les urls de connexion aux différents providers.

Nous allons l’intégrer en tant que paramètre de configuration de notre projet Cloud (fichier ServiceConfiguration.Cloud.cscfg):
<Setting name="ACSConfiguration" value="https://monapp.accesscontrol.windows.net/v2/metadata/IdentityProviders.js?protocol=wsfederation&realm=http://monapp.cloudapp.net/&reply_to=&context=&request_id=&version=1.0&callback=" />
Comme on peut le voir ci-dessus, on a supprimé l’adresse de réponse donnée par la configuration ACS et nous allons donc la changer au besoin.
Dans votre action de login voici comment procéder:
1 – Récupération de l’url du JSON, enregistrée en paramètre:
var acsJson = configManager.GetSetting("ACSConfiguration");
2 - Prenons une variable callbackUrl, contenant l’URL d’origine appelée par l’utilisateur, on l’encore au format URL:
string url = System.Web.HttpUtility.UrlEncode(callbackUrl);
3 – Avec une expression régulière on insère notre url de callback dans le paramètre Reply_To:
string pattern = "reply_to=";
string replacement = string.Concat("reply_to=", url);
Regex rgx = new Regex(pattern);
string result = rgx.Replace(acsJson, replacement);
4 – Enfin on appelle l’url puis on traite le JSON pour récupérer les chaînes de connection à nos providers:
var response = HttpWebRequest.Create(result).GetResponse();
var deserializer = new DataContractJsonSerializer(typeof(List<AcsIdentityProvider>));
using (var stream = response.GetResponseStream())
{
providers = deserializer.ReadObject(stream) as List<AcsIdentityProvider>;
}
Les utilisateurs seront alors redirigé par ACS sur la page donnée dans la variable callbackUrl passé à la fonction de login après authentification. Difficile de faire plus simple… il suffisait de le savoir!

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :