【问题标题】:RestSharp - Retrieving Authorization token from POSTed responseRestSharp - 从发布的响应中检索授权令牌
【发布时间】:2014-02-07 06:41:17
【问题描述】:

我正在尝试将用户名和密码传递到以下 URL:

https://maxcvservices.dnb.com/rest/Authentication

根据文档,user_id 和密码必须作为带有键的标头传递:分别为 x-dnb-user、x-dnb-pwd。

到目前为止,我有以下似乎可以工作的代码,但我无法检索响应对象返回的身份验证令牌:

public static void Main (string[] args)
{
    var client = new RestClient ("https://maxcvservices.dnb.com/rest/Authentication");
    var request = new RestRequest (Method.POST);
    request.AddHeader("x-dnb-user", myEmail);
    request.AddHeader("x-dnb-pwd", myPassword);
    IRestResponse resp = client.Execute(request);
    var content = resp.Content;
    Console.WriteLine (resp.StatusDescription);
    Console.WriteLine (resp.StatusCode);
}

当我尝试打印内容时,我得到一个空行,但我真正期待的是服务返回的身份验证令牌。我认为我在代码中正在做的几件事(但不确定)是将用户 ID 和密码作为 POST 请求中的标头传递,这是必需的。令牌作为响应对象中“授权”字段的值返回。我想知道如何打印令牌。此外,statusDescription、statusCode 都打印 OK,这告诉我我有正确的请求,但无法在响应中找到身份验证令牌。在指导我如何访问返回的 POST 响应的授权字段中的身份验证令牌时,任何帮助将不胜感激。

【问题讨论】:

    标签: c# authentication http-post restsharp


    【解决方案1】:

    可能是 AUTHTOKEN 与 cookie 一起返回,因为这是一种常见的方法。

    在这种情况下,您需要将 CookieContanier 附加到您的 IRestClient,然后此容器将存储 cookie。如果您对后续请求使用相同的客户端,则该身份验证 cookie 会让您进入。

    private CookieContainer _cookieJar;
    
    ...    
    
    _cookieJar = new CookieContainer();
    _client.CookieContainer = _cookieJar;
    

    然后您可以在请求后检查容器

    _client.PostAsync(MyRequest, (r, h) =>
    {
       r.Cookies... // inspect em
    

    【讨论】:

      【解决方案2】:

      所以你试图从IRestResponse 对象中获取Authorization 的HttpHeader 值?

      你可以使用例如为此使用 LINQ:

      var authroizationHeaderFromResponse = resp.Headers.FirstOrDefault(h => h.Name == "Authorization");
      
                  if (authroizationHeaderFromResponse != null)
                  {
                      Console.WriteLine(authroizationHeaderFromResponse.Value);
                  }
      

      产量

      INVALID CREDENTIALS
      

      你假设如果响应状态码是200 - OK,那么它必须有一个响应体。

      文档是否特别声明您应该期望响应正文中的令牌作为回报?

      如果 D&B 开发人员愿意,他们可以发送没有响应正文的 200 - OK 响应,或者他们可以在其他地方添加他们的序列化令牌(JSON、XML 等),例如在标题字段中。

      可以在此代码中看到一个示例,该代码来自 ASP.NET Web API 从成功的 PUT 返回响应

      if (result.Success)
      {
          var dto = Mapper.Map<TEntity, TDto>(result.Data as TEntity);
      
          var response = Request.CreateResponse(HttpStatusCode.Created, dto);
          var uri = Url.Link("DefaultApi", new {id = dto.Id});
          response.Headers.Location = new Uri(uri);
      
          return response;
      }
      

      这将返回 200 - OK,响应正文中带有序列化对象 (result.Data),但我更改以下内容并没有错

      var response = Request.CreateResponse(HttpStatusCode.Created, dto);
      

      类似

      var response = Request.CreateResponse(HttpStatusCode.Created);
      

      这样您仍然会得到 200 - OK 响应,但没有响应正文。这当然违背了HTTP/1.1 Standard 对 PUT 动词的建议,但它仍然有效。

      我什至可以这样做来咯咯笑

      throw new HttpResponseException(HttpStatusCode.Created);
      

      您仍然会得到 200 - OK 响应。有点邪恶,但有可能。

      我建议尝试从设置了x-dnb-user 和x-dnb-pwd 标头字段的另一个资源中获取数据,然后检查是否返回了响应正文。也许 D&B 在实现这些标头字段时受到了基本身份验证的启发,因此要求它们出现在每个请求中?

      值得一试。

      让我知道结果如何。

      【讨论】:

        【解决方案3】:

        查看 IRestResponse 的 Headers 集合。它可能会在那里而不是内容。

        第 奥利

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-03
          • 2022-06-27
          • 1970-01-01
          • 2020-06-12
          • 2021-08-19
          • 2016-03-08
          相关资源
          最近更新 更多