Skip to content

Bugfix: 1385: Authentication fails if both date and x-ms-date headers are present - #2316

Open
BillBooks wants to merge 8 commits into
Azure:mainfrom
BillBooks:main
Open

Bugfix: 1385: Authentication fails if both date and x-ms-date headers are present#2316
BillBooks wants to merge 8 commits into
Azure:mainfrom
BillBooks:main

Conversation

@BillBooks

Copy link
Copy Markdown

For queues and blobs, when forming the shared key token, the Date header should be treated as the empty string when the x-ms-date header is present.

For tables, the value of the x-ms-date header should be used as the value of the Date header if the x-ms-date header is present.

This behavior is documented at
https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key

specified

For queues and blobs, when forming the shared key token, the Date header
should be treated as the empty string when the x-ms-date header is
present.

For tables, the value of the x-ms-date header shoudl be used as the
value of the Date header if teh x-ms-date header is present.

This behavior is documented at
https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key

@blueww Wei Wei (blueww) left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The change generally looks good to me.
It's better to also add test cases for blob/Queue servicce.

@BillBooks BillBooks changed the title headers are presemBugfix: 1385: Authentication fails if both date and x-ms-date origin/p-willa/PR/add-missing-config Bugfix: 1385: Authentication fails if both date and x-ms-date origin/p-willa/PR/add-missing-config Dec 10, 2023
@BillBooks BillBooks changed the title Bugfix: 1385: Authentication fails if both date and x-ms-date origin/p-willa/PR/add-missing-config Bugfix: 1385: Authentication fails if both date and x-ms-date headers are present Dec 10, 2023
@BillBooks

Copy link
Copy Markdown
Author

I'll look at adding some tests

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The current implementation uses value-truthiness instead of header-presence checks for x-ms-date, which can still diverge from the documented signing rules, and it also lacks a regression test covering requests that include both headers.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

This PR updates Azurite’s Shared Key / Shared Key Lite signature generation to follow Azure Storage’s documented rules when both Date and x-ms-date headers are present, which previously could cause authentication failures.

Changes:

  • Table: prefer x-ms-date as the effective Date value when constructing strings-to-sign.
  • Blob/Queue: force the Date component in the string-to-sign to be empty when x-ms-date is present.
  • Documentation: add a changelog entry for the fix.
File summaries
File Description
tests/table/utils/table.entity.tests.utils.for.rest.ts Updates test signing helper to prefer x-ms-date for table SharedKeyLite strings-to-sign.
src/table/authentication/TableSharedKeyLiteAuthenticator.ts Adjusts table SharedKeyLite string-to-sign to prefer x-ms-date over Date.
src/table/authentication/TableSharedKeyAuthenticator.ts Adjusts table SharedKey string-to-sign to prefer x-ms-date over Date (including secondary path).
src/queue/authentication/QueueSharedKeyAuthenticator.ts Blanks out Date in strings-to-sign when x-ms-date is present for queue auth.
src/blob/authentication/BlobSharedKeyAuthenticator.ts Blanks out Date in strings-to-sign when x-ms-date is present for blob auth (including secondary path).
ChangeLog.md Notes the shared key signature generation fix for x-ms-date.
Review details

Suppressed comments (5)

src/blob/authentication/BlobSharedKeyAuthenticator.ts:151

  • Same issue as above: Date should be signed as an empty string whenever x-ms-date is present, but this truthiness check can fall back to Date when x-ms-date is an empty string. Prefer checking header presence via req.getHeader(x-ms-date) !== undefined.
          this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ? "" : this.getHeaderValueToSign(req, HeaderConstants.DATE),

src/queue/authentication/QueueSharedKeyAuthenticator.ts:347

  • For queue SharedKeyLite, Date must be an empty string when x-ms-date is present. This truthiness check can incorrectly fall back to Date if x-ms-date is an empty string. Use a presence check (req.getHeader(x-ms-date) !== undefined).
          this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ? "" : this.getHeaderValueToSign(req, HeaderConstants.DATE)

src/table/authentication/TableSharedKeyAuthenticator.ts:115

  • Same issue in the secondary string-to-sign path: if x-ms-date is present, its value must be used as the Date component (even if empty), but || can fall back to Date. Use an explicit presence check on x-ms-date.
        this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ||
          this.getHeaderValueToSign(req, HeaderConstants.DATE)

src/table/authentication/TableSharedKeyLiteAuthenticator.ts:112

  • Same issue in the secondary Table SharedKeyLite string-to-sign: || can fall back to Date when x-ms-date is present but empty. Use an explicit presence check on x-ms-date to match the service rules.
        this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ||
          this.getHeaderValueToSign(req, HeaderConstants.DATE)

src/blob/authentication/BlobSharedKeyAuthenticator.ts:85

  • This change fixes signature generation for requests that include both Date and x-ms-date, but there are existing auth tests that only cover the default SDK header set. Add a regression test that sends a request with both headers set (Blob/Queue/and Table) and verifies authentication succeeds, to prevent future regressions.
        this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ? "" : this.getHeaderValueToSign(req, HeaderConstants.DATE),
  • Files reviewed: 6/6 changed files
  • Comments generated: 5
  • Review effort level: Lite

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/blob/authentication/BlobSharedKeyAuthenticator.ts Outdated
this.getHeaderValueToSign(req, HeaderConstants.CONTENT_MD5),
this.getHeaderValueToSign(req, HeaderConstants.CONTENT_TYPE),
this.getHeaderValueToSign(req, HeaderConstants.DATE),
this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ? "" : this.getHeaderValueToSign(req, HeaderConstants.DATE),
Comment on lines +56 to +57
this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ||
this.getHeaderValueToSign(req, HeaderConstants.DATE)
Comment on lines +56 to +57
this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ||
this.getHeaderValueToSign(req, HeaderConstants.DATE)
Comment on lines +55 to +56
getHeaderValueToSign(HeaderConstants.X_MS_DATE, headers) ||
getHeaderValueToSign(HeaderConstants.DATE, headers)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Several updated call sites use truthiness/getHeaderValueToSign() to detect x-ms-date presence, but that helper collapses “missing” and “present-but-empty” to "", so the documented “header present” rule is not implemented reliably/consistently.

Review details

Suppressed comments (8)

Previously missed (2) — in code that hasn't changed since the last review.

src/table/authentication/TableSharedKeyAuthenticator.ts:115

  • Same issue as the primary string-to-sign: || makes the x-ms-date preference depend on value truthiness rather than header presence. Use a presence check so Date is not used when x-ms-date is present (even if empty).
    src/table/authentication/TableSharedKeyLiteAuthenticator.ts:112
  • Secondary string-to-sign has the same header-presence vs truthiness issue: || falls back to Date when x-ms-date is present but empty. Use a presence check to follow the documented behavior.

src/table/authentication/TableSharedKeyAuthenticator.ts:57

  • Using || here only prefers x-ms-date when it has a truthy value; if the x-ms-date header is present but empty, this will incorrectly fall back to Date. The Shared Key docs describe behavior based on header presence, so this should key off header existence instead of truthiness.
        this.getHeaderValueToSign(req, HeaderConstants.CONTENT_MD5),
        this.getHeaderValueToSign(req, HeaderConstants.CONTENT_TYPE),
        this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ||
          this.getHeaderValueToSign(req, HeaderConstants.DATE)

src/table/authentication/TableSharedKeyLiteAuthenticator.ts:58

  • Using || here only prefers x-ms-date when it has a truthy value; if the x-ms-date header is present but empty, this will incorrectly fall back to Date. The Shared Key docs describe behavior based on header presence, so this should key off header existence instead of truthiness.
      [
        this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ||
          this.getHeaderValueToSign(req, HeaderConstants.DATE)
      ].join("\n") +

src/queue/authentication/QueueSharedKeyAuthenticator.ts:332

  • getHeaderValueToSign() returns "" when a header is missing or present-but-empty, so this conditional can't reliably implement the "if x-ms-date header is present" rule. Use req.getHeader(HeaderConstants.X_MS_DATE) !== undefined to check presence instead.
          this.getHeaderValueToSign(req, HeaderConstants.CONTENT_MD5),
          this.getHeaderValueToSign(req, HeaderConstants.CONTENT_TYPE),
          this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ? "" : this.getHeaderValueToSign(req, HeaderConstants.DATE),
          this.getHeaderValueToSign(req, HeaderConstants.IF_MODIFIED_SINCE),

src/queue/authentication/QueueSharedKeyAuthenticator.ts:348

  • Same presence-detection issue as the SharedKey path: getHeaderValueToSign() collapses missing and empty headers to "", so the ternary should check req.getHeader(...) !== undefined instead.
          this.getHeaderValueToSign(req, HeaderConstants.CONTENT_MD5),
          this.getHeaderValueToSign(req, HeaderConstants.CONTENT_TYPE),
          this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ? "" : this.getHeaderValueToSign(req, HeaderConstants.DATE)
        ].join("\n") +

src/blob/authentication/BlobSharedKeyAuthenticator.ts:152

  • In the secondary-account string-to-sign, this ternary uses getHeaderValueToSign(X_MS_DATE) which cannot distinguish missing vs present-but-empty headers (it returns "" for both). For consistency with the primary path (which uses req.getHeader(...) !== undefined) and to follow the documented "header present" rule, switch this to a presence check.
          this.getHeaderValueToSign(req, HeaderConstants.CONTENT_MD5),
          this.getHeaderValueToSign(req, HeaderConstants.CONTENT_TYPE),
          this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ? "" : this.getHeaderValueToSign(req, HeaderConstants.DATE),
          this.getHeaderValueToSign(req, HeaderConstants.IF_MODIFIED_SINCE),

tests/table/utils/table.entity.tests.utils.for.rest.ts:57

  • This uses ||, which prefers x-ms-date only when the value is truthy; if the x-ms-date header key is present but empty, it will incorrectly fall back to Date. Mirror the production behavior by checking header presence (e.g., hasOwnProperty) instead of value truthiness.
    [
      getHeaderValueToSign(HeaderConstants.X_MS_DATE, headers) ||
        getHeaderValueToSign(HeaderConstants.DATE, headers)
    ].join("\n") +
  • Files reviewed: 6/6 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Header-presence checks are still value/truthiness-based in several updated call sites (can mis-handle empty-but-present x-ms-date) and the new behavior lacks direct regression tests for “both Date and x-ms-date present”.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Review details

Suppressed comments (6)

tests/table/utils/table.entity.tests.utils.for.rest.ts:56

  • || uses truthiness, so an explicitly present but empty x-ms-date header will be treated as absent and the Date value will be signed instead. For Table SharedKeyLite the spec is presence-based: when x-ms-date is present, use it as the Date value even if empty.
      getHeaderValueToSign(HeaderConstants.X_MS_DATE, headers) ||
        getHeaderValueToSign(HeaderConstants.DATE, headers)

src/table/authentication/TableSharedKeyLiteAuthenticator.ts:57

  • Using || here is value-based; if x-ms-date is present but empty, the code will fall back to Date, which contradicts the presence-based rule described in the PR. Prefer an explicit presence check on the header and then choose which value to sign.
        this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ||
          this.getHeaderValueToSign(req, HeaderConstants.DATE)

src/table/authentication/TableSharedKeyAuthenticator.ts:57

  • Using || makes the selection value-based; an empty-but-present x-ms-date will incorrectly fall back to Date. The shared-key docs referenced in the PR describe presence-based behavior, so prefer checking header presence explicitly.
        this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ||
          this.getHeaderValueToSign(req, HeaderConstants.DATE)

src/queue/authentication/QueueSharedKeyAuthenticator.ts:331

  • getHeaderValueToSign() returns "" for both a missing header and a present-but-empty header, so this truthiness check can fail to blank out the Date line when x-ms-date is present. Use req.getHeader(...) !== undefined to detect presence.
          this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ? "" : this.getHeaderValueToSign(req, HeaderConstants.DATE),

src/queue/authentication/QueueSharedKeyAuthenticator.ts:347

  • Same presence check issue as the SharedKey path: the truthiness check on getHeaderValueToSign(X_MS_DATE) cannot distinguish missing vs present-but-empty. Use req.getHeader(...) !== undefined so any provided x-ms-date forces an empty Date element.
          this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ? "" : this.getHeaderValueToSign(req, HeaderConstants.DATE)

src/blob/authentication/BlobSharedKeyAuthenticator.ts:154

  • This presence check uses getHeaderValueToSign(X_MS_DATE) (truthiness), but that helper returns "" for both missing and empty values. For consistency with the primary path (and to match the presence-based rule), use req.getHeader(X_MS_DATE) !== undefined here too.
          this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ? "" : this.getHeaderValueToSign(req, HeaderConstants.DATE),
  • Files reviewed: 6/6 changed files
  • Comments generated: 3
  • Review effort level: Lite

Comment thread src/table/authentication/TableSharedKeyAuthenticator.ts Outdated
Comment thread src/table/authentication/TableSharedKeyLiteAuthenticator.ts Outdated
this.getHeaderValueToSign(req, HeaderConstants.CONTENT_MD5),
this.getHeaderValueToSign(req, HeaderConstants.CONTENT_TYPE),
this.getHeaderValueToSign(req, HeaderConstants.DATE),
req.getHeader(HeaderConstants.X_MS_DATE) !== undefined ? "" : this.getHeaderValueToSign(req, HeaderConstants.DATE),
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Several updated string-to-sign paths still use ||/truthy checks that can fall back to Date despite x-ms-date being present, and there’s no explicit regression test for the “both headers present” scenario.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Review details

Suppressed comments (7)

Previously missed (4) — in code that hasn't changed since the last review.

src/blob/authentication/BlobSharedKeyAuthenticator.ts:154

  • The primary string-to-sign uses req.getHeader(... ) !== undefined, but the secondary string-to-sign uses getHeaderValueToSign(...) ? ..., which can treat an empty x-ms-date value as "not present" and reintroduce Date into the signature. Make the secondary path use the same explicit header-presence check as the primary path for consistent SharedKey behavior.
    src/queue/authentication/QueueSharedKeyAuthenticator.ts:331
  • This conditional uses getHeaderValueToSign(...) as the presence check, but that helper returns "" for any falsey value. If x-ms-date is present but empty, the code will incorrectly include Date in the signature instead of treating it as an empty string (per SharedKey rules when x-ms-date is present). Prefer checking header presence via req.getHeader(HeaderConstants.X_MS_DATE) !== undefined.

This issue also appears on line 347 of the same file.
src/table/authentication/TableSharedKeyLiteAuthenticator.ts:57

  • As with SharedKey, using || here means an empty/falsey x-ms-date value will fall back to Date even though the header is present. Switch to an explicit header-presence check so x-ms-date always wins when supplied.

This issue also appears on line 111 of the same file.
tests/table/utils/table.entity.tests.utils.for.rest.ts:56

  • Using || to pick between x-ms-date and Date falls back to Date when x-ms-date is present but empty/falsey, which still contradicts the documented rule of preferring x-ms-date whenever the header is present. Use an explicit presence check (like headers[HeaderConstants.X_MS_DATE] !== undefined) so the signing logic matches the Table service behavior.

src/table/authentication/TableSharedKeyLiteAuthenticator.ts:112

  • Same issue as the primary path: || can fall back to Date when x-ms-date is present but empty/falsey. Use a presence check so the secondary string-to-sign follows the documented precedence rules consistently.
        this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ||
          this.getHeaderValueToSign(req, HeaderConstants.DATE)

src/queue/authentication/QueueSharedKeyAuthenticator.ts:347

  • Same issue as above: getHeaderValueToSign(...) is not a reliable presence check. Use req.getHeader(HeaderConstants.X_MS_DATE) !== undefined so the Date component is always empty when x-ms-date is present.
          this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ? "" : this.getHeaderValueToSign(req, HeaderConstants.DATE)

src/blob/authentication/BlobSharedKeyAuthenticator.ts:86

  • This changes SharedKey signing behavior across Blob/Queue/Table, but there are no regression tests that explicitly cover requests containing both Date and x-ms-date (the typical failure mode for this bug). Adding a targeted test that sends both headers and verifies the request is authorized would help prevent future regressions.
        req.getHeader(HeaderConstants.X_MS_DATE) !== undefined ? "" : this.getHeaderValueToSign(req, HeaderConstants.DATE),
  • Files reviewed: 6/6 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment thread src/table/authentication/TableSharedKeyAuthenticator.ts Outdated
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Several updated code paths still use value-based (|| / truthy) checks for x-ms-date rather than header-presence checks, which can diverge from the documented behavior and lacks targeted regression coverage.

Review details

Suppressed comments (8)

Previously missed (5) — in code that hasn't changed since the last review.

src/blob/authentication/BlobSharedKeyAuthenticator.ts:154

  • This x-ms-date check is value-based (getHeaderValueToSign(...) ?) rather than presence-based. If x-ms-date is present but an empty string, Date would incorrectly be signed as non-empty, which contradicts the shared key rules when x-ms-date is present.
    src/queue/authentication/QueueSharedKeyAuthenticator.ts:331
  • The shared key rules require treating the Date field as empty whenever the x-ms-date header is present. Using getHeaderValueToSign(req, X_MS_DATE) ? is value-based and will not trigger if x-ms-date is present-but-empty (getHeaderValueToSign returns ""). Check header presence (req.getHeader(...) !== undefined) instead.

This issue also appears on line 347 of the same file.
src/table/authentication/TableSharedKeyLiteAuthenticator.ts:58

  • Table SharedKeyLite stringToSign should use the x-ms-date header whenever it is present (even if its value is an empty string). Using || with getHeaderValueToSign() falls back to Date when x-ms-date is present-but-empty because getHeaderValueToSign() returns "" for falsy values; use an explicit presence check instead.

This issue also appears on line 109 of the same file.
tests/table/utils/table.entity.tests.utils.for.rest.ts:57

  • The REST test signing helper uses || to choose between x-ms-date and Date, which is value-based and can diverge from the intended behavior when x-ms-date is present but empty. To mirror the service behavior and spec, choose based on header presence instead of truthiness.
    src/table/authentication/TableSharedKeyLiteAuthenticator.ts:108
  • The comment contains a typo/garbled fragment ("stringToSignconst stringToSign: string ="), which makes the intent hard to read.

src/table/authentication/TableSharedKeyLiteAuthenticator.ts:114

  • Secondary-account SharedKeyLite stringToSign has the same issue: || selects Date when x-ms-date is present but empty. The spec is based on header presence, so check req.getHeader(...) !== undefined and then sign with that header's value (which may legitimately be empty).
      const stringToSign_secondary: string =
      [
        this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ||
          this.getHeaderValueToSign(req, HeaderConstants.DATE)
      ].join("\n") +
      "\n" +

src/queue/authentication/QueueSharedKeyAuthenticator.ts:347

  • Same presence-vs-value issue as above for SharedKeyLite header signing: the Date line should be empty if x-ms-date header exists, regardless of whether the x-ms-date value is an empty string.
          this.getHeaderValueToSign(req, HeaderConstants.X_MS_DATE) ? "" : this.getHeaderValueToSign(req, HeaderConstants.DATE)

src/blob/authentication/BlobSharedKeyAuthenticator.ts:86

  • There are existing auth tests for Blob/Queue, but I couldn't find any test that exercises the specific regression case described in the PR (both Date and x-ms-date headers present). Adding a regression test that injects a Date header alongside the SDK-generated x-ms-date (e.g., via a custom pipeline policy) would help prevent this from reappearing across Blob and Queue; Table REST tests could add a similar case.
        req.getHeader(HeaderConstants.X_MS_DATE) !== undefined ? "" : this.getHeaderValueToSign(req, HeaderConstants.DATE),
  • Files reviewed: 6/6 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

There are small but concrete issues to fix before merge (changelog formatting typo and an obvious comment paste/formatting error in the modified auth code block).

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Review details
  • Files reviewed: 9/9 changed files
  • Comments generated: 2
  • Review effort level: Lite

Comment thread ChangeLog.md Outdated
@@ -108,8 +109,9 @@ export default class TableSharedKeyLiteAuthenticator implements IAuthenticator {
// JS/.net Track2 SDK will generate stringToSign from IP style URI with "-secondary" in authenticationPath, so will also compare signature with this kind stringToSignconst stringToSign: string =
Copilot AI review requested due to automatic review settings September 4, 2026 12:03

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The newly added raw-HTTP Blob/Queue regression tests should clean up the created container/queue to keep test state isolated and avoid leaving resources behind.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Review details
  • Files reviewed: 9/9 changed files
  • Comments generated: 2
  • Review effort level: Lite

Comment on lines +218 to +223
assert.strictEqual(
statusCode,
201,
`Expected container create to succeed (201) with both Date and x-ms-date headers, got ${statusCode}`
);
});
Comment on lines +235 to +240
assert.strictEqual(
statusCode,
201,
`Expected queue create to succeed (201) with both Date and x-ms-date headers, got ${statusCode}`
);
});

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

The signing changes match documented Azure Storage rules and are covered by new regression tests for Blob, Queue, and Table.

Review details
  • Files reviewed: 9/9 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants