2010-08-12 6 views
3

Je travaille sur une application .NET 2.0 winforms qui appelle un site Web ASP.NET 2.0. Le site Web est authentifié à l'aide de l'authentification par formulaire. Le service d'authentification est activé dans le web.config, et j'ai fait quelques experiments pour confirmer que je peux accéder au service via JSON.Appel du service d'authentification ASP.NET 2.0 à partir d'un client non Web

Voici ma question: existe-t-il un code intégré pour consommer les services Web System.Web.Extensions (authenticationService, profileService, etc.) dans un environnement purement .NET (pas ASP.NET)? Je peux trouver des exemples en utilisant Silverlight et les services WCF ultérieurs, mais rien dans un environnement 2.0 sur le client et le serveur. L'ajout du service d'authentification en tant que service Web semble être l'approche logique, mais je ne pourrais jamais l'utiliser pour pointer vers mon serveur de développement - je suppose que cela pourrait être une question distincte.

Si je dois gérer la requête et la réponse AJAX à un niveau inférieur, c'est certainement faisable, mais si quelque chose était déjà prévu à cet effet, ce serait certainement plus facile et moins sujette aux erreurs.

Répondre

1

Je n'ai jamais eu de réponse pour cela, mais je l'ai finalement compris avec l'aide de this tutorial. La réponse courte était oui, j'ai dû gérer la demande/réponse AJAX à un niveau assez bas. En supposant que vous ayez un nom d'utilisateur et un mot de passe avec lesquels vous devez vous authentifier, vous devez d'abord obtenir un cookie d'authentification. J'ai utilisé le Json.NET library from Newtonsoft pour la sérialisation et la désérialisation JSON, mais vous pouvez utiliser n'importe quoi.

Cookie GetFormAuthenticationCookie(string username, string password) 
     { 
      string uriString = ServerName + AUTH_SERVICE_URL; 
      Uri uri = new Uri(uriString); 

      // Need to cast this to HttpWebRequest to set CookieContainer property 
      // With a null CookieContainer property on the request, we'd get an 
      // empty HttpWebRequest.Cookies property 
      HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest; 
      request.Method = "POST"; 
      request.ContentType = "application/json; charset=utf-8"; 
      request.CookieContainer = new CookieContainer(); // needed to get non-empty Cookies collection back in response object 

      // requestContents needs to look like this: 
      // { 
      //  username = 'theUserName', 
      //  password = 'thePassword', 
      //  createPersistentCookie = false 
      // } 
      string requestContents = GetJsonForLoginRequest(username, password); 

      byte[] postData = Encoding.UTF8.GetBytes(requestContents); 
      request.ContentLength = postData.Length; 
      using (Stream dataStream = request.GetRequestStream()) 
      { 
       dataStream.Write(postData, 0, postData.Length); 
      } 

      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      if (response.StatusCode != HttpStatusCode.OK) 
      { 
       throw new WebException("Response returned HttpStatusCode " + response.StatusCode); 
      } 

      // For now, assuming response ContentType is "application/json; charset=utf-8" 
      object responseJson; 
      using (Stream responseStream = response.GetResponseStream()) 
      { 
       StreamReader reader = new StreamReader(responseStream); 
       string responseString = reader.ReadToEnd(); 

       responseJson = JavaScriptConvert.DeserializeJson(responseString); 
      } 

      if (responseJson is bool) 
      { 
       bool authenticated = (bool)responseJson; 
       if (authenticated) 
       { 
        // response was "true"; return the cookie 
        return response.Cookies[".ASPXFORMSAUTH"]; 
       } 
       else 
       { 
        // apparently the login failed 
        return null; 
       } 
      } 
      else 
      { 
       return null; 
      } 
     } 

Ensuite, ajoutez le cookie aux demandes suivantes. Dans mon cas, cela signifiait ajouter le cookie au CookieContainer du proxy de service Web que j'utilisais.

+0

Utilisez-vous Authentication_JSON_AppService.axd en tant que AUTH_SERVICE_URL? Avez-vous eu des problèmes avec les exceptions 404? –

+0

J'ai utilisé Authentication_JSON_AppService.axd/Login comme AUTH_SERVICE_URL. –

+0

Merci pour la réponse. Oui, j'ai essayé ça. Pour une raison quelconque, je n'ai pas réussi à faire fonctionner Authentication_JSON_AppService.axd/Login. Ecrire une authentification personnalisée WebMethod était assez facile. –

0

Je n'ai pas réussi à faire fonctionner authenticationService. J'ai continué à recevoir des erreurs 404 lorsque j'ai essayé d'appeler Authentication_JSON_AppService.axd depuis mon application winforms. J'ai donc fini par écrire ma propre méthode d'authentification JSON WebMethod.

Désolé ce n'est pas C#, mon projet est VB.NET. J'ai utilisé ce http://progtutorials.tripod.com/Authen.htm comme référence. Veillez à rendre votre WebService d'authentification accessible aux utilisateurs anonymes dans votre fichier web.config.

<location path="Authentication.asmx"> 
    <system.web> 
     <authorization> 
     <allow users="*" /> 
     </authorization> 
    </system.web> 
    </location> 
Questions connexes