0

Voici le contexte de mon problème: Je suis en train de développer une application Windows Store qui sera téléchargée sur plusieurs tablettes que notre client prévoit d'utiliser. Cette application de la tablette fera des appels dans une API Web qui à son tour fera des opérations CRUD avec un référentiel (SQL Server via EntityFramework). Tout doit utiliser l'authentification Windows. Les tablettes sont Dell exécutant Windows 10. Chaque utilisateur se connectera avec ses propres informations d'identification de domaine actives. La tablette transmettra les informations d'identification à l'API Web qui, à son tour, les transmettra au référentiel (base de données). Sur la base des informations d'identification, le référentiel déterminera le groupe auquel appartient l'utilisateur et, sur cette base, il donnera accès aux ressources auxquelles l'utilisateur est autorisé à accéder.Utilisation de l'authentification Windows pour appeler une API Web à partir d'une application Windows Store

Mon API Web fonctionne correctement. Je l'ai testé avec Fiddler. Pour la requête HTTP GET, je veux tester, j'ai coché la case "Automatically Authenticate" et je peux voir les trois messages successifs, les deux premiers retournant avec 401 et le troisième renvoyant le code HTTP 200, avec les données demandées. Toutefois, lorsque j'essaie de l'appeler à partir de mon application Windows Store, je n'envoie qu'une seule demande GET, la première. Mon API Web est hébergée dans IIS Express. Sur les conseils d'un membre très différent de ce groupe, j'ai configuré IIS Express pour exposer l'API Web en utilisant l'adresse IP de ma machine de développement plutôt que "localhost". Avant cela, je ne verrais aucune requête GET frapper le serveur, pas même le premier.

Je sais que l'authentification Windows utilise le schéma NTLM et nécessite un processus de négociation, d'où les 3 messages que Fiddler envoie initialement au serveur? Comment ai-je besoin d'écrire mon code client Web API pour contourner cette négociation? J'ai passé toute la matinée et l'après-midi à trouver des solutions à mon problème, ici sur SO et sur de nombreux autres sites, mais d'une manière ou d'une autre, je ne l'ai toujours pas fait fonctionner. Je dois manquer quelque chose et je ne sais pas quoi. Voici mon code sur l'API Web côté client:

var authHandler = new HttpClientHandler() 
{ 
    Credentials = CredentialCache.DefaultNetworkCredentials, 
    ClientCertificateOptions = ClientCertificateOption.Automatic 
}; 

var webApiClient = new HttpClient(authHandler) 
{ 
    BaseAddress = new Uri(_serviceUri), // _serviceUri is a string that looks like this "http://10.120.5.201:53045" 
}; 

webApiClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

HttpResponseMessage response = await webApiClient.GetAsync("api/user"); 

Mon appel ne retourne jamais de GetAsync, mais Fiddler, je peux voir que les premières requêtes GET sont affichées sur le serveur. Comment puis-je faire en sorte que mon client suive les coulisses, comme le fait Fiddler, et envoie les deux autres messages pour que, finalement, le troisième revienne avec une réponse au code HTTP 200 et avec les données que je reçois dans Fiddler?

Si quelqu'un peut me diriger dans la bonne direction, je serais très reconnaissant.

Répondre

0

Le problème était que le paramètre "Enterprise Authentication" n'était pas défini dans l'onglet Capabilities du fichier Package.appxmanifest de mon application. Il m'a fallu un certain temps pour comprendre que c'était le problème, mais dès que je l'ai vérifié, mon application a commencé à utiliser l'authentification Windows.