Comment s’authentifier dans une application ASP.NET MVC à partir d’une application console

J’ai une application console qui envoie un XML à une application MVC et reçoit un autre XML en réponse. Cela fonctionne parfaitement, mais je veux append une autorisation (pour des raisons évidentes).

Voici le code de l’application console:

using (var wc = new WebClient()) { return GetXmlFromBytes( wc.UploadData("URL", GetBytesFromXml(xmlToSend)) ); } 

Et voici le code de l’application MVC:

 public ActionResult DoSomething() { XElement xml = XElement.Load(new System.IO.StreamReader(Request.InputStream)); var response = InsertDataFromXml(xml); return File(GenerateFileFromResponse, "text/xml", "result.xml"); } 

Et il fonctionne. Donc, pour implémenter l’autorisation, j’ai ajouté le code suivant:

Console (a ajouté le wc.Credentials ):

 using (var wc = new WebClient()) { wc.Credentials = new NetworkCredential("user", "password"); return GetXmlFromBytes( wc.UploadData("URL", GetBytesFromXml(xmlToSend)) ); } 

Application MVC (ajouté le [Authorize] ):

 [Authorize] public ActionResult DoSomething() { XElement xml = XElement.Load(new System.IO.StreamReader(Request.InputStream)); var response = InsertDataFromXml(xml); return File(GenerateFileFromResponse, "text/xml", "result.xml"); } 

Et ça ne marche pas. Je ne sais pas si cette information est nécessaire pour résoudre ce problème, mais mon web.config contient l’élément suivant:

    

En fait, le fichier renvoyé par l’application MVC est le code HTML de la page LogOn!

Que dois-je faire pour résoudre ce problème? Un paramètre manque-t-il dans les NetworkCredentials ? Je sais que cela peut être instancié avec un domain , mais je ne sais pas quel est le domaine des utilisateurs de l’application MVC.

Et, juste pour être sûr: j’ai assuré que “utilisateur” et “mot de passe” sont valides.

Vous mélangez des types d’informations d’identification.

 wc.Credentials = new NetworkCredential("user", "password"); 

est pour l’authentification HTTP.

    

est l’authentification par formulaires.

Celles-ci sont entièrement différentes et non compatibles. Utiliser l’authentification par formulaire à partir d’une application de ligne de commande est une tâche ardue. Vous devez accéder à la page de connexion avec une demande, POST le nom d’utilisateur et le mot de passe, puis prendre le cookie d’authentification renvoyé et le joindre aux demandes suivantes.

Vous devez tout d’abord vous authentifier lorsque vous utilisez l’authentification par formulaires.

  1. Invoquer la méthode Web d’ouverture de session et capturer le cookie d’authentification à partir de la réponse HTTP
  2. Définir le cookie d’authentification sur la deuxième requête HTTP à la méthode DoSomething

Ou définissez le mode d’authentification = “Windows” si vous êtes sur un intranet local!

Créez un AuthenticationService qui peut être utilisé pour authentifier les formulaires. Avec la classe ClientBaseExtensions , vous pouvez extraire le cookie de votre client de service WCF. Injectez ce cookie dans l’autre appel …

 Ssortingng cookies = null; var auth = new AuthenticationServiceClient(); using (new OperationContextScope(auth.InnerChannel)) { auth.Login("user", "password", null, true); cookies = auth.GetIncomingCookies(); } 

Maintenant, injectez les données de cookie dans votre service de données ou votre appel HTTP.

Voir http://mytoolkit.codeplex.com/wikipage?title=ClientBaseExtensions