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

时间:2014-01-17 19:31:41

标签: c# authentication http-post restsharp

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

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请求,这是必需的。令牌将作为响应对象中“授权”字段的值返回。我想知道如何打印令牌。 statusDescription,statusCode也打印OK,告诉我我有正确的请求,但无法在响应中找到auth令牌。在指导我如何在返回的POST响应的Authorization字段中访问auth令牌时,将非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

您是否尝试从HttpHeader对象获取Authorization的{​​{1}}值?

您可以使用例如使用LINQ:

IRestResponse

哪个收益

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

            if (authroizationHeaderFromResponse != null)
            {
                Console.WriteLine(authroizationHeaderFromResponse.Value);
            }

您认为如果响应状态代码为INVALID CREDENTIALS ,则必须有一个响应正文。

文档具体是否表明您应该期望响应正文中的令牌?

D& B开发人员可以根据需要发送没有响应正文的200 - OK响应,或者他们可以在其他位置添加序列化令牌(JSON,XML等),例如:在标题字段中。

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

200 - OK

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

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;
}

类似

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

这样你仍然可以获得200 - OK响应,但没有响应体。这当然违反了HTTP/1.1 Standard对PUT动词的建议,但它仍然有用。

我甚至可以为咯咯地笑。

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

你仍然可以获得200 - OK的回复。有点邪恶,但可能。

我建议尝试从设置了throw new HttpResponseException(HttpStatusCode.Created); x-dnb-user标头字段的其他资源中获取数据,然后检查是否返回了响应正文。也许D&amp; B在实现这些标题字段时受到基本认证的启发,因此要求它们出现在每个请求中?

值得一试。

让我知道这是怎么回事。

答案 1 :(得分:1)

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

H个 奥利

答案 2 :(得分: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