对Shelly Power Product使用摘要式身份验证,无法从第二个get请求中获取200个代码



我正在努力让一些Shelly Power产品(此处为API文档(能够从调用。NET 6最小API应用程序。

根据Shelly的Digest Authentication文档和RFC 7616,我有一个HttpClient的扩展方法,它基本上接受URL的HttpRequestMessagehttp:///rpc/Switch.GetStatus?id=0。在为HttpRequestMessage设置了正常的头(Accept、User Agent等(之后,它将该HttpRequestMessage作为参数传递给该扩展方法。

将HttpRequestMessage传递给扩展方法后,它将被克隆到一个新的HttpRequestMessage中,包含内容、版本和标头。之后,进行第一个SendAync((调用,生成401响应,其中包含WWW Authentication头。在解析出领域、nonce和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);

传递克隆的请求和完成选项枚举的第二个SendAsync((。

var authRes = await client.SendAsync(digestRequest, httpCompletionOption);

之后的问题是,我仍然收到401的回复。甚至没有得到指示另一个问题的另一个代码。它只是表现得像是提出了同样的要求。

我应该放弃HttpRequestMessage的克隆,只创建一个新的吗?有什么不正确的地方会立即突出吗?我想注意的是,Shelly只指定Authorization字符串只包含包含的值,它不需要uri、qop、opaque和其他一些值。

看起来有一种直接的方法可以做到这一点,方法是使用HttpClientHanlder并设置NetworkCredentials属性,然后将处理程序传递给HttpClient。

相关内容

最新更新