将身份验证添加到REST Web服务请求?

时间:2010-07-20 21:21:09

标签: .net wcf web-services rest

我正在使用WCF REST Startkit来创建测试REST Web服务。为了测试它,我使用HTTPClient(由工具包提供)和HttpResponseMessage创建一个简单的控制台应用程序来向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);

其中argsParser是我的参数解析器类,用于获取基址和URI。它正如我在内联网中使用我的REST服务所说的那样工作正常。但是,当我将测试应用程序与Twitter REST服务等Web REST服务一起使用时,我得到了例外。

我认为这是由我的工作网络设置引起的。 BlueCode安全性已实施为对工作中所有浏览器/ http请求的强制执行。当我的浏览器第一次访问Twitter这样的Web REST服务时,我必须在提示窗口中键入我的user / pwd。在我提供验证信息后,浏览器工作正常。

所以我想在我的控制台应用程序中创建的HttpClient和HTTPResponseMessage实例中,我可能需要向它们添加/附加一些身份验证信息。我不确定提供所需身份验证信息需要哪些类或API?

1 个答案:

答案 0 :(得分:2)

要通过授权标头使用WCF REST入门套件附带的HttpClient提供凭据,请使用:

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[] { };
    }