我正在努力获得一些Shelly产品(这里的API文档),它可以从.NET 6最小API应用程序中调用。
继来自Shelly和RFC 7616的摘要身份验证文档之后,我为HttpClient提供了一个扩展方法,它基本上为URL HttpClient取了一个HttpRequestMessage设置正常标头后(接受、用户代理等)对于该HttpRequestMessage,它将该HttpRequestMessage作为参数传递给该扩展方法。
将HttpRequestMessage传递给扩展方法后,它将被克隆到一个新的HttpRequestMessage中,其中包含内容、版本和标题。然后,进行第一个SendAync()调用,生成包含WWW-身份验证头的401响应。在解析出领域、当前和qop之后,将根据规范执行多轮散列。Shelly使用SHA256而不是MD5 (应该如此),但总体上遵循哈希的标准。在此之后,将创建新形成的身份验证头字符串,并将其格式化为:
Digest username="admin", realm="shellyplugus-083af2018b68", nonce="633e7ba8", cnonce=8724224, response="9B15CEBA6E5FD862271954AC2C40948D6237511B83748143FF763A0E76B1A346", algorithm=SHA-256下面的代码是创建一个AuthHeaderObject,上面的字符串的创建,并被添加到克隆的HttpRequestMessage中(这里称为"digestRequest“):
var digestAuthHeaders = new DigestAuthHeader(
"Digest", realm, username, password, nonce, qop, clientNonce, "SHA-256");
var digestRequestHeader = digestAuthHeaders.DigestRequestHeader();
digestRequest.Headers.Add("Authorization", digestRequestHeader);传递克隆请求和完成选项enum的第二个SendAsync()。
var authRes = await client.SendAsync(digestRequest, httpCompletionOption);之后的问题是,我仍然得到401的答复。甚至没有得到另一个指示另一个问题的代码。这就像提出了同样的要求。
我应该放弃HttpRequestMessage的克隆,而仅仅创建一个新的克隆吗?有什么是不正确的吗?我想指出的是,Shelly只指定授权字符串只包含包含的值,它不需要uri、qop、不透明和其他一些值。
发布于 2022-10-06 09:08:16
看起来有一种直接的方法可以通过使用HttpClientHanlder和设置NetworkCredentials属性来实现这一点,然后将处理程序传递给HttpClient。
https://stackoverflow.com/questions/73970309
复制相似问题