2011-03-07 6 views
2

Je dois mettre en œuvre un petit serveur REST pour gérer une base de données distante, rien de spécial. La sécurité n'est pas un problème critique, car ce serveur doit s'exécuter dans un environnement intranet; nous voulons seulement filtrer les utilisateurs et les rediriger vers des ressources appropriées.HttpListener Digest Auth schéma

 HttpListener listener = new HttpListener(); 
     listener.Realm = "testserver1"; 
     listener.AuthenticationSchemes = AuthenticationSchemes.Basic; 

     foreach (string s in prefixes) 
     { 
      listener.Prefixes.Add(s); 
     } 

     listener.Start(); 
     Console.WriteLine("Listening..."); 

     HttpListenerContext context = listener.GetContext(); 

     HttpListenerRequest request = context.Request; 
     HttpListenerResponse response = context.Response; 

     string responseString = "<HTML><BODY>" + DateTime.Now.ToString() + "</BODY></HTML>"; 
     byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString); 

     response.ContentLength64 = buffer.Length; 
     System.IO.Stream output = response.OutputStream; 
     output.Write(buffer, 0, buffer.Length); 
     output.Close(); 

     listener.Stop(); 

Ce code (extrait du site de Microsoft) fonctionne parfaitement du côté serveur et -Lorsque le listener.GetContext() returns- Je peux vérifier le nom d'utilisateur et mot de passe de l'objet utilisateur et d'établir la façon de traiter la demande. Modification des initiales listener.AuthenticationSchemes = AuthenticationSchemes.Basic à

listener.AuthenticationSchemes = AuthenticationSchemes.Digest 

il cesse de fonctionner comme je pense et que le schéma de base auth font efficacement. Le listener.GetContext() call never returns. HttpListener SEEMS pour bloquer toute demande et, du côté client, je continue à être invité pour le nom d'utilisateur et mot de passe. J'ai essayé l'utilisateur local, l'administrateur local, l'utilisateur de domaine, l'administrateur de domaine, environ 500 noms de fantaisie: rien ne fonctionne. GetContext() plus de retours. Pouvez-vous m'aider?

Merci d'avance.

L.

Répondre

0

Vous pouvez utiliser AuthenticationSchemeSelectorDelegate, a travaillé pour moi. Exemple:

_listener.AuthenticationSchemeSelectorDelegate = delegate(HttpListenerRequest request) 
{ 
    string temp = request.Headers["Authorization"]; 
    if (!string.IsNullOrEmpty(temp)) 
     throw new Exception("Auth string: " + temp); 
    return AuthenticationSchemes.Digest; // here where you return auth type for every request eg. can be Basic,Digest 
}; 

http://msdn.microsoft.com/en-us/library/system.net.httplistener.authenticationschemeselectordelegate.aspx

0

La valeur attribuée à listener.Realm doit être le nom du domaine Windows qui est utilisé pour l'authentification. "testserver1" ne me ressemble pas à un nom de domaine.