首页 文章

设置HttpClient的授权标头

提问于
浏览
295

我有一个HttpClient,我用它来使用REST API . 但是,我在设置Authorization标头时遇到问题 . 我需要将标头设置为我从执行OAuth请求时收到的令牌 . 我看到.NET的一些代码表明以下内容,

httpClient.DefaultRequestHeaders.Authorization = new Credential(OAuth.token);

但是,Credential类在WinRT中不存在 . 任何人有任何想法如何设置授权标头?

11 回答

  • -3

    所以这样做的方法如下,

    httpClient.DefaultRequestHeaders.Authorization =
        new AuthenticationHeaderValue("Bearer", "Your Oauth token");
    
  • 213
    request.DefaultRequestHeaders.Authorization = 
        new AuthenticationHeaderValue(
            "Basic", 
            Convert.ToBase64String(
                System.Text.ASCIIEncoding.ASCII.GetBytes(
                    string.Format("{0}:{1}", "yourusername", "yourpwd"))));
    
  • 32

    我寻找一个处理这个问题的好方法,我正在寻找同样的问题 . 希望这个答案能帮助每个遇到同样问题的人都喜欢我 .

    using (var client = new HttpClient())
    {
        var url = "https://www.theidentityhub.com/{tenant}/api/identity/v1";
        client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
        var response = await client.GetStringAsync(url);
        // Parse JSON response.
        ....
    }
    

    来自https://www.theidentityhub.com/hub/Documentation/CallTheIdentityHubApi的参考

  • -2

    我同意TheWhiteRabbit的答案,但如果你使用HttpClient进行大量调用,我认为代码似乎有点重复 .

    我认为有两种方法可以改善答案 .

    创建一个帮助程序类来创建客户端:

    public static class ClientHelper
    {
        // Basic auth
        public static HttpClient GetClient(string username,string password)
        {
                var authValue = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}")));
    
                var client = new HttpClient(){
                    DefaultRequestHeaders = { Authorization = authValue}
                    //Set some other client defaults like timeout / BaseAddress
                };
                return client;
        }
    
        // Auth with bearer token
        public static HttpClient GetClient(string token)
        {
                var authValue = new AuthenticationHeaderValue("Bearer", token);
    
                var client = new HttpClient(){
                    DefaultRequestHeaders = { Authorization = authValue}
                    //Set some other client defaults like timeout / BaseAddress
                };
                return client;
        }
    }
    

    Usage:

    using(var client = ClientHelper.GetClient(username,password))
    {
        //Perform some http call
    }
    
    using(var client = ClientHelper.GetClient(token))
    {
        //Perform some http call
    }
    

    创建扩展方法:

    不赢得美容奖但是效果很好:)

    public static class HttpClientExtentions
        {
            public static AuthenticationHeaderValue ToAuthHeaderValue(this string username, string password)
            {
                return new AuthenticationHeaderValue("Basic",
            Convert.ToBase64String(
                System.Text.Encoding.ASCII.GetBytes(
                    $"{username}:{password}")));
            }
        }
    

    Usage:

    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Authorization = _username.ToAuthHeaderValue(_password); 
    }
    

    我再次认为上面两个选项使客户端使用语句重复性降低一点 . 请记住,如果要进行多个http调用,最好重用HttpClient,但我认为这个问题有点超出了范围 .

  • 7

    因为它是一个 good practice to reuse the HttpClient instance ,对于性能和端口耗尽问题,并且因为没有一个答案给出了这个解决方案(甚至引导你走向不良做法:()),我在这里给出了我在类似问题上做出的答案的链接:

    https://stackoverflow.com/a/40707446/717372

    关于如何很好地使用HttpClient的一些消息来源:

  • 3

    使用C#HttpClient设置基本身份验证 . 以下代码对我有用 .

    using (var client = new HttpClient())
            {
                var webUrl ="http://localhost/saleapi/api/";
                var uri = "api/sales";
                client.BaseAddress = new Uri(webUrl);
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.ConnectionClose = true;
    
                //Set Basic Auth
                var user = "username";
                var password = "password";
                var base64String =Convert.ToBase64String( Encoding.ASCII.GetBytes($"{user}:{password}"));
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",base64String);
    
                var result = await client.PostAsJsonAsync(uri, model);
                return result;
            }
    
  • 3

    这是我如何做到的:

    using (HttpClient httpClient = new HttpClient())
    {
       Dictionary<string, string> tokenDetails = null;
       var messageDetails = new Message { Id = 4, Message1 = des };
       HttpClient client = new HttpClient();
       client.BaseAddress = new Uri("http://localhost:3774/");
       var login = new Dictionary<string, string>
           {
               {"grant_type", "password"},
               {"username", "sa@role.com"},
               {"password", "lopzwsx@23"},
           };
       var response = client.PostAsync("Token", new FormUrlEncodedContent(login)).Result;
       if (response.IsSuccessStatusCode)
       {
          tokenDetails = JsonConvert.DeserializeObject<Dictionary<string, string>>(response.Content.ReadAsStringAsync().Result);
          if (tokenDetails != null && tokenDetails.Any())
          {
             var tokenNo = tokenDetails.FirstOrDefault().Value;
             client.DefaultRequestHeaders.Add("Authorization", "Bearer " + tokenNo);
             client.PostAsJsonAsync("api/menu", messageDetails)
                 .ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode());
          }
       }
    }
    

    这个you-tube视频帮了我很多忙 . 请检查一下 . https://www.youtube.com/watch?v=qCwnU06NV5Q

  • 5

    使用 AuthenticationHeaderValue 类的 System.Net.Http 程序集

    public AuthenticationHeaderValue(
        string scheme,
        string parameter
    )
    

    我们可以为 httpclient 设置或更新现有的 Authorization 标头,如下所示:

    httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", TokenResponse.AccessToken);
    
  • 53

    Use Basic Authorization And Json Parameters.

    using (HttpClient client = new HttpClient())
                        {
                            var request_json = "your json string";
    
                            var content = new StringContent(request_json, Encoding.UTF8, "application/json");
    
                            var authenticationBytes = Encoding.ASCII.GetBytes("YourUsername:YourPassword");
    
                            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                                   Convert.ToBase64String(authenticationBytes));
                            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
                            var result = await client.PostAsync("YourURL", content);
    
                            var result_string = await result.Content.ReadAsStringAsync();
                        }
    
  • 540

    这可能有用,如果你从服务接收json或xml,我想如果你使用函数MakeXmlRequest(把结果放在xmldocumnet中)和MakeJsonRequest,你可以让你知道 Headers 和T类型是如何工作的 . (将json放在你想要的类中,与json响应具有相同的结构)

    /*-------------------------example of use-------------*/
    MakeXmlRequest<XmlDocument>("your_uri",result=>your_xmlDocument_variable =     result,error=>your_exception_Var = error);
    
    MakeJsonRequest<classwhateveryouwant>("your_uri",result=>your_classwhateveryouwant_variable=result,error=>your_exception_Var=error)
    /*-------------------------------------------------------------------------------*/
    
    
    public class RestService
    {
        public void MakeXmlRequest<T>(string uri, Action<XmlDocument> successAction, Action<Exception> errorAction)
        {
            XmlDocument XMLResponse = new XmlDocument();
            string wufooAPIKey = ""; /*or username as well*/
            string password = "";
            StringBuilder url = new StringBuilder();
            url.Append(uri);
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url.ToString());
            string authInfo = wufooAPIKey + ":" + password;
            authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
            request.Timeout = 30000;
            request.KeepAlive = false;
            request.Headers["Authorization"] = "Basic " + authInfo;
            string documento = "";
            MakeRequest(request,response=> documento = response,
                                (error) =>
                                {
                                 if (errorAction != null)
                                 {
                                    errorAction(error);
                                 }
                                }
                       );
            XMLResponse.LoadXml(documento);
            successAction(XMLResponse);
        }
    
    
    
        public void MakeJsonRequest<T>(string uri, Action<T> successAction, Action<Exception> errorAction)
        {
            string wufooAPIKey = "";
            string password = "";
            StringBuilder url = new StringBuilder();
            url.Append(uri);
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url.ToString());
            string authInfo = wufooAPIKey + ":" + password;
            authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
            request.Timeout = 30000;
            request.KeepAlive = false;
            request.Headers["Authorization"] = "Basic " + authInfo;
           // request.Accept = "application/json";
          //  request.Method = "GET";
            MakeRequest(
               request,
               (response) =>
               {
                   if (successAction != null)
                   {
                       T toReturn;
                       try
                       {
                           toReturn = Deserialize<T>(response);
                       }
                       catch (Exception ex)
                       {
                           errorAction(ex);
                           return;
                       }
                       successAction(toReturn);
                   }
               },
               (error) =>
               {
                   if (errorAction != null)
                   {
                       errorAction(error);
                   }
               }
            );
        }
        private void MakeRequest(HttpWebRequest request, Action<string> successAction, Action<Exception> errorAction)
        {
            try{
                using (var webResponse = (HttpWebResponse)request.GetResponse())
                {
                    using (var reader = new StreamReader(webResponse.GetResponseStream()))
                    {
                        var objText = reader.ReadToEnd();
                        successAction(objText);
                    }
                }
            }catch(HttpException ex){
                errorAction(ex);
            }
        }
        private T Deserialize<T>(string responseBody)
        {
            try
            {
                var toReturns = JsonConvert.DeserializeObject<T>(responseBody);
                 return toReturns;
            }
            catch (Exception ex)
            {
                string errores;
                errores = ex.Message;
            }
            var toReturn = JsonConvert.DeserializeObject<T>(responseBody);
            return toReturn;
        }
    }
    }
    
  • 22

    这可能有助于设置 Headers :

    WebClient client = new WebClient();
    
    string authInfo = this.credentials.UserName + ":" + this.credentials.Password;
    authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
    client.Headers["Authorization"] = "Basic " + authInfo;
    

相关问题