2010-07-20 4 views
2

J'utilise WCF REST Startkit pour créer un test REST service Web. Pour le tester, je crée une simple application de la console avec HTTPClient (fourni par le kit) et HttpResponseMessage pour faire une demande au service REST. Voici quelques codes:Ajouter l'authentification à un service Web Demande de REST?

HttpClient client = new HttpClient(argsParser.BaseAddress); 
HttpResponseMessage resp = client.Get(argsParser.URI); 
Console.WriteLine(@"READING DATA FROM {0}{1}", 
    argsParser.BaseAddress, 
    argsParser.URI.Length == 0 ? @"" : string.Format(@"/{0}", 
    argsParse.URI)); 
resp.EnsureStatusIsSuccessful(); 
string contentType = resp.Content.ContentType; 
Console.WriteLine("CONTENT TYPE: {0}", contentType); 
string content = resp.Content.ReadAsString(); 
Console.WriteLine(
@"CONTENT: {0}", content); 

où argsParser est ma classe d'analyseur argument pour obtenir l'adresse de base et URI. Cela fonctionne bien comme je l'ai dit avec mon service REST dans notre intranet. Toutefois, lorsque j'ai utilisé l'application de test avec un service Web REST tel que le service Twitter REST, j'ai obtenu des exceptions.

Je pense que cela est causé par mes paramètres réseau de travail. BlueCode La sécurité a été implémentée comme une application à tous les navigateurs/requêtes http au travail. Je dois taper mon utilisateur/pwd dans une fenêtre d'invite lorsque mon navigateur accède à un service REST Web comme Twitter pour la première fois. Après avoir fourni mes informations d'authentification, le navigateur fonctionne correctement.

donc je suppose que, avec HttpClient et HTTPResponseMessage instances créées dans mon application console, je peut avoir besoin d'ajouter/attacher des informations d'authentification pour eux. Je ne suis pas sûr de quelles classes ou API j'ai besoin pour fournir les informations d'authentification requises?

Répondre

2

Fournir des informations d'identification via l'en-tête d'autorisation avec le HttpClient qui vient avec la WCF REST Starter utilisation Kit ceci:

1.

HttpClient client = new HttpClient(); 
client.TransportSettings.Credentials = new NetworkCredential("user", "pass"); 

Du côté du serveur, vous pouvez extraire ceux qui sont en RequestInterceptor ou dans un HttpModule personnalisé, qui peut également vous aider à faire une authentification de base personnalisée avec IIS ...

2.

vous pouvez ajouter un jeton d'autorisation/clé, comme celui-ci:

client.DefaultHeaders.Authorization = new Credential("18f34d01-blah-4959-blah-7db6ac5433cd"); 

OU vous pouvez aussi mettre le jeton dans un en-tête personnalisé comme celui-ci:

client.DefaultHeaders.Add("CustomAuthHeader", "18f34d01-blah-4959-blah-7db6ac5433cd"); 

Du côté du serveur, vous extraire cet en-tête spécifique. ...

Voici comment vous pouvez extraire les informations d'identification sur le service d'un objet message:

private string[] ExtractCredentials(Message reqMessage) 
    { 
     HttpRequestMessageProperty request = 
      (HttpRequestMessageProperty)reqMessage.Properties[HttpRequestMessageProperty.Name]; 

     string authHeader = request.Headers["Authorization"]; 

     if (authHeader != null && authHeader.StartsWith("Basic")) 
     { 
      string encodedUserPass = authHeader.Substring(6).Trim(); 

      Encoding encoding = Encoding.GetEncoding("iso-8859-1"); 
      string userPass = encoding.GetString(Convert.FromBase64String(encodedUserPass)); 
      int separator = userPass.IndexOf(':'); 

      string[] credentials = new string[2]; 
      credentials[0] = userPass.Substring(0, separator); 
      credentials[1] = userPass.Substring(separator + 1); 

      return credentials; 
     } 

     return new string[] { }; 
    } 
Questions connexes