首页 > 解决方案 > HttpWebRequest 中的 Hawk 身份验证或类似的同步 POST

问题描述

我有一个使用 Hawk 身份验证的项目。有一个名为Thinktecture.IdentityModel.Hawk的开源库。使用 HttpClient 的 PostAsync 方法发布请求。我必须删除 PostAsync 方法并且需要使用一些同步代码。通过互联网,我找到了几篇使用 HttpWebRequest 的文章,但我不知道如何使用 HttpClient 等效代码,尤其是对于 Hawk,我可以在 HttpClient 的情况下传递HttpClientFactory.Create方法。请帮忙。

private void MethodToPost()
        {
            using (var client = HttpClientFactory.Create(new HawkValidationHandler(CreateHawkHeader())))
            {
                client.BaseAddress = new Uri(API_BASE_URL);
                MultipartFormDataContent form = new MultipartFormDataContent();

                byte[] fileContent = System.IO.File.ReadAllBytes("myfile.pdf");
                var httpFileContent = new ByteArrayContent(fileContent);
                httpFileContent.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
                form.Add(httpFileContent, "FileContent", "myfile");
                foreach (var parameter in parameters) // these are my parameters
                {
                    form.Add(new StringContent(parameter.Value), parameter.Key);
                }
                HttpResponseMessage response = await client.PostAsync(API_BASE_URL + urlPostPath, form);
                if (response.IsSuccessStatusCode)
                {
                    jobID = await response.Content.ReadAsAsync<string>();
                }
            }
        }
        private ClientOptions CreateHawkHeader()
        {
            var credential = new Credential()
            {
                Id = My user id,
                Algorithm = SupportedAlgorithms.SHA256,
                User = "abc",
                Key = "my api key"
            };
            var options = new ClientOptions()
            {
                CredentialsCallback = () => credential,
                RequestPayloadHashabilityCallback = (r) => true,
                NormalizationCallback = (req) =>
                {
                    string name = "X-Request-Header-To-Protect";
                    return req.Headers.ContainsKey(name) ?
                                name + ":" + req.Headers[name].First()
                                                              : null;
                }
            };
            return options;
        }

标签: httpwebrequestdotnet-httpclientsystem.net.httpwebrequesthawkauthentication

解决方案


推荐阅读