2010-07-20 106 views
2

我正在使用WCF REST Startkit來創建測試REST Web服務。爲了測試它,我使用HTTPClient(由套件提供)和HttpResponseMessage創建了一個簡單的控制檯應用程序,以向REST服務發出請求。以下是一些代碼:將身份驗證添加到對REST Web服務的請求?

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); 

其中argsParser是我的參數解析器類,用於獲取基地址和URI。正如我在我們的Intranet中使用REST服務所說的那樣,它工作正常。但是,當我使用Web REST服務(例如Twitter REST服務)使用測試應用程序時,出現異常。

我認爲這是由我的工作網絡設置引起的。 BlueCode安全性已被實施爲對工作中的所有瀏覽器/ http請求的執行。當我的瀏覽器首次訪問Twitter等網絡REST服務時,我必須在提示窗口輸入我的用戶/密碼。在提供我的身份驗證信息後,瀏覽器正常工作。

所以我想用我的控制檯應用程序中創建的HttpClient和HTTPResponseMessage實例,我可能需要添加/附加一些身份驗證信息給他們。我不確定我需要提供哪些類或API來提供所需的身份驗證信息?

回答

2

要通過授權頭提供憑證HttpClient的附帶了WCF REST入門套件使用這個:

1.

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

在服務器端,你可以提取那些在RequestInterceptor或在自定義的HttpModule,這也可以幫助你做IIS自定義的基本身份驗證...

2.

你可以還添加了一個授權令牌/鑰匙,就像這樣:

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

,或者您也可以把令牌在這樣的自定義標題:

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

在服務器端則提取特定的頭。 ...

這裏是你如何提取的服務的憑證出一個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[] { }; 
    }