Skip to content

Improve documentation on role or user change during SignalR connection lifetime#37289

Open
cincuranet wants to merge 4 commits into
dotnet:mainfrom
cincuranet:improve-role-change-docs
Open

Improve documentation on role or user change during SignalR connection lifetime#37289
cincuranet wants to merge 4 commits into
dotnet:mainfrom
cincuranet:improve-role-change-docs

Conversation

@cincuranet

@cincuranet cincuranet commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

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.

Pull request overview

This PR updates the SignalR authentication/authorization documentation to clarify how authorization behaves when a user’s roles/claims change after a SignalR connection is established.

Changes:

  • Adds a new section explaining that SignalR caches the authenticated principal for the lifetime of a connection, so role/claim updates aren’t reflected on existing connections.
  • Provides guidance on mitigation options (closing connections or performing “current data” checks).
  • Updates the bearer-token section to reference the new guidance.

Comment thread aspnetcore/signalr/authn-and-authz.md Outdated
Comment thread aspnetcore/signalr/authn-and-authz.md Outdated
Comment thread aspnetcore/signalr/authn-and-authz.md Outdated
Comment thread aspnetcore/signalr/authn-and-authz.md

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.

Pull request overview

Copilot reviewed 1 out of 1 changed files in this pull request and generated 3 comments.

Comment thread aspnetcore/signalr/authn-and-authz.md
Comment thread aspnetcore/signalr/authn-and-authz.md Outdated
Comment thread aspnetcore/signalr/authn-and-authz.md Outdated

@BrennanConroy BrennanConroy left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Content looks good, will leave it for the docs writers to review for flow and style.

@wadepickett

Copy link
Copy Markdown
Contributor

...reviewing

* A user is signed in with the `Editor` role and has an open SignalR connection.
* The app removes the `Editor` role from that user.

On the next long-poll request, the authentication middleware might authenticate the user without the `Editor` role (for example, if roles are loaded from a data store or the cookie is refreshed). However, the hub continues to authorize the user's `[Authorize(Roles = "Editor")]` hub method invocations because `Context.User` (<xref:Microsoft.AspNetCore.SignalR.HubCallerContext.User?displayProperty=nameWithType>) still holds the principal that was cached before the role was removed. The user can keep calling `Editor`-only hub methods until the connection is closed.

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.

Suggested change
On the next long-poll request, the authentication middleware might authenticate the user without the `Editor` role (for example, if roles are loaded from a data store or the cookie is refreshed). However, the hub continues to authorize the user's `[Authorize(Roles = "Editor")]` hub method invocations because `Context.User` (<xref:Microsoft.AspNetCore.SignalR.HubCallerContext.User?displayProperty=nameWithType>) still holds the principal that was cached before the role was removed. The user can keep calling `Editor`-only hub methods until the connection is closed.
On the next long-poll request, the authentication middleware might authenticate the user without the `Editor` role. For example, this can happen if roles are loaded from a data store or the cookie is refreshed. However, the hub continues to authorize the user's `[Authorize(Roles = "Editor")]` hub method invocations because `Context.User` (<xref:Microsoft.AspNetCore.SignalR.HubCallerContext.User?displayProperty=nameWithType>) still holds the principal that was cached before the role was removed. The user can keep calling `Editor`-only hub methods until the connection is closed.

Minor item: Breaking up into seperate sentances to improve readability.

@wadepickett wadepickett 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.

Approved. Well done, looks great! I could only find a very minor item which I provided a suggestion for you inline.

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.

Improve documentation on role or user change during SignalR connection lifetime

4 participants