首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用HttpClient进行身份验证发布

如何使用HttpClient进行身份验证发布
EN

Stack Overflow用户
提问于 2015-06-16 12:36:42
回答 3查看 75.1K关注 0票数 37

我正在尝试使用HttpClient在C#中执行以下curl (对我有效)。

代码语言:javascript
复制
curl -X POST http://www.somehosturl.com \
     -u <client-id>:<client-secret> \
     -d 'grant_type=password' \
     -d 'username=<email>' \
     -d 'password=<password>' \
     -d 'scope=all

C#代码:

代码语言:javascript
复制
HttpClientHandler handler = new HttpClientHandler { Credentials = new  
            System.Net.NetworkCredential ("my_client_id", "my_client_secret")
    };


    try
    {
        using(var httpClient = new HttpClient(handler))
        {
            var activationUrl = "www.somehosturl.com";

            var postData = "grant_type=password&username=myemail@myemail.com&password=mypass&scope=all";
            var content = new StringContent(postData, Encoding.UTF8, "application/x-www-form-urlencoded");

            var response = await httpClient.PostAsync(activationUrl, content);
            if(!response.IsSuccessStatusCode)
                return null;

            var result = await response.Content.ReadAsStringAsync();

            return result;
        }
    }
    catch(Exception)
    {
        return null;
    }

在执行时,就会崩溃,甚至不会捕获异常

通常情况下,我可以很好地获取和发布,但让我感到困惑的是如何设置身份验证内容(client-id和client-secret)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-16 16:50:03

首先,你必须用你的<clientid><clientsecret>设置Authorization-Header。

您应该使用FormUrlEncodedContent而不是StringContent,如下所示:

代码语言:javascript
复制
var client = new HttpClient();
client.BaseAddress = new Uri("http://myserver");
var request = new HttpRequestMessage(HttpMethod.Post, "/path");

var byteArray = new UTF8Encoding().GetBytes("<clientid>:<clientsecret>");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));

var formData = new List<KeyValuePair<string, string>>();
formData.Add(new KeyValuePair<string, string>("grant_type", "password"));
formData.Add(new KeyValuePair<string, string>("username", "<email>"));
formData.Add(new KeyValuePair<string, string>("password", "<password>"));
formData.Add(new KeyValuePair<string, string>("scope", "all"));

request.Content = new FormUrlEncodedContent(formData);
var response = await client.SendAsync(request);
票数 35
EN

Stack Overflow用户

发布于 2015-06-16 15:21:35

尝试将凭据直接放入HttpClient的headers属性中。

代码语言:javascript
复制
using (var client = new HttpClient()) {
       var byteArray = Encoding.ASCII.GetBytes("my_client_id:my_client_secret");
       var header = new AuthenticationHeaderValue("Basic",Convert.ToBase64String(byteArray));
       client.DefaultRequestHeaders.Authorization = header;

       return await client.GetStringAsync(uri);
}
票数 25
EN

Stack Overflow用户

发布于 2021-03-26 15:12:18

请参阅BasicAuthenticationHeaderValue

代码语言:javascript
复制
httpClient.DefaultRequestHeaders.Authorization
    = new BasicAuthenticationHeaderValue("login", "password");
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30858890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档