如何发送新请求以使用新访问令牌重定向 URL

How to send new request to redirect URL with new access token

我被要求创建一个简单的 MVC 网页来帮助我们的安全官测试我们的一个网站。

该页面允许用户在尝试访问 URL 之前输入新 ID 和新访问令牌。安全人员拥有有效的凭据,并且能够通过名为 Zap 的工具获取他的访问令牌。

我总是从服务器得到相同的响应: "Response status code does not indicate success: 401"

我做错了什么?

public async Task<IActionResult> AOFun(RequestValues requestValues)
    {
        try
        {
            string id = requestValues.id;
            string accessToken = requestValues.accessToken;
            string url =
            @"https://companyDomain/api/api/pl/redirect-url?&vendorSystem=false&action=5&id={{idValue}}&app=ONE"
            .Replace("{{idValue}}", id);

            using (var requestMessage = new HttpRequestMessage(HttpMethod.Get, url))
            {
                requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

                var responseData = await client.SendAsync(requestMessage);
                responseData.EnsureSuccessStatusCode();
                var responseString = await responseData.Content.ReadAsStringAsync();
                ResponseModel rm = JsonConvert.DeserializeObject<ResponseModel>(responseString);
                ViewBag.ResponseString = rm.url;
            }


        }
        catch (Exception ex)
        {
            ViewBag.ResponseString = "error: " + ex.Message;
        }

        return View("Index");
    }

编辑以显示 POSTMAN 的回复

{
    "status": 401,
    "code": 5001,
    "message": "There was a problem processing this request. We are sorry for the inconvenience. Please contact the Help Desk or try again later.",
    "htmlMessage": "There was a problem processing this request. We are sorry for the inconvenience. Please contact the Help Desk at 1-800-000-0000 or try again later.",
    "link": "http://www.companyDomain.com",
    "developerMessage": "IGNORE_STACK_TRACE:pl/redirect-url"
}

邮递员请求headers:

var client = new     
RestClient("https://agentsonly.msagroup.com/api/api/pl/redirect-url?vendorSystem=false&action=5&id=920287945119&app=ONE&=");
var request = new RestRequest(Method.GET);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("Connection", "keep-alive");
request.AddHeader("Accept-Encoding", "gzip, deflate");
request.AddHeader("Host", "agentsonly.msagroup.com");
request.AddHeader("Postman-Token", "e27138a6-425c-4d11-a09a-0625daeb22a3,8439731b-3dad-464c-9b86-0655da31ead7");
request.AddHeader("Cache-Control", "no-cache");
request.AddHeader("Accept", "*/*");
request.AddHeader("User-Agent", "PostmanRuntime/7.15.2");
request.AddHeader("Authorization", "Bearer 965c59f9-3f06-370d-8980-764576136e4e");
IRestResponse response = client.Execute(request);

邮递员回复headers:

问题不在于 AOFun 操作中的代码 - 请求永远不会到达那里。

响应表明您的请求未通过身份验证 - 可能您使用的令牌已过期。所以你必须开始一个新的 session 并登录以生成一个新的令牌。然后将新令牌放入 header 到 AOFun 请求..

更新后的控制器方法如下。对于这个站点,我不应该使用 Bearer 令牌。我必须发送要应用的令牌的用户 ID。

  public async Task<IActionResult> AOFun(RequestValues requestValues)
    {
        try
        {
            ServicePointManager.ServerCertificateValidationCallback += (o, c, ch, er) => true;
            string userID = requestValues.userId;
            string id = requestValues.id;
            string accessToken = requestValues.accessToken;
            string url =
            @"https://companydomain.com/api/api/pl/redirect-url?&vendorSystem=false&action=5&id={{idValue}}&app=ONE"
            .Replace("{{idValue}}", id);
            using (var requestMessage = new HttpRequestMessage(HttpMethod.Get, url))
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Add("userId", userID);
                client.DefaultRequestHeaders.Add("access_token", accessToken);
                var responseData = await client.SendAsync(requestMessage);
                responseData.EnsureSuccessStatusCode();
                var responseString = await responseData.Content.ReadAsStringAsync();
                ResponseModel rm = JsonConvert.DeserializeObject<ResponseModel>(responseString);
                ViewBag.ResponseString = rm.url;
            }


        }
        catch (Exception ex)
        {
            ViewBag.ResponseString = "error: " + ex.Message;
        }

        return View("Index");
    }