RestSharp - 从发布的响应中检索授权令牌

问题描述 投票:0回答:3

我正在尝试将用户名和密码传递到以下 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);
}

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

c# authentication http-post restsharp
3个回答
4
投票

所以你试图从

HttpHeader
对象中获取
Authorization
IRestResponse
值?

您可以为此使用 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 标准 对 PUT 动词的建议,但它仍然有效。

我什至可以为了咯咯笑而这样做

throw new HttpResponseException(HttpStatusCode.Created);

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

我建议尝试使用

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

值得一试

让我知道结果如何。


1
投票

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

Hth 奥利


0
投票

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

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

private CookieContainer _cookieJar;

...    

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

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

_client.PostAsync(MyRequest, (r, h) =>
{
   r.Cookies... // inspect em
© www.soinside.com 2019 - 2024. All rights reserved.