RestSharp - 从 POSTed 响应中检索授权令牌

ano*_*428 4 c# authentication http-post restsharp

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

https://maxcvservices.dnb.com/rest/Authentication
Run Code Online (Sandbox Code Playgroud)

根据文档,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);
}
Run Code Online (Sandbox Code Playgroud)

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

Run*_*tad 5

那么您想从对象中获取HttpHeader值吗?AuthorizationIRestResponse

您可以使用 LINQ 来实现:

var authroizationHeaderFromResponse = resp.Headers.FirstOrDefault(h => h.Name == "Authorization");

if (authroizationHeaderFromResponse != null)
{
    Console.WriteLine(authroizationHeaderFromResponse.Value);
}
Run Code Online (Sandbox Code Playgroud)

哪个产量

INVALID CREDENTIALS
Run Code Online (Sandbox Code Playgroud)

您假设如果响应状态代码为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;
}
Run Code Online (Sandbox Code Playgroud)

这将返回 200 - OK,响应正文中包含序列化对象(result.Data),但我更改以下内容没有任何问题

var response = Request.CreateResponse(HttpStatusCode.Created, dto);
Run Code Online (Sandbox Code Playgroud)

对于类似的东西

var response = Request.CreateResponse(HttpStatusCode.Created);
Run Code Online (Sandbox Code Playgroud)

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

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

throw new HttpResponseException(HttpStatusCode.Created);
Run Code Online (Sandbox Code Playgroud)

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

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

值得一试。

让我知道效果如何。