I’m using .NET 8 with Blazor (render mode: InteractiveServer on the pages I need)
One of the pages with this mode has buttons to call dialogs. Computer objects are passed to these dialogs as parameters on the basis of which the HubConnection is built.
private async Task<HubConnection> SetupConnection(Computer computer, string hubPath, bool startConnection, CancellationToken cancellationToken)
{
var connection = new HubConnectionBuilder()
.WithUrl($"https://{computer.IpAddress}:5001/{hubPath}", options =>
{
options.AccessTokenProvider = async () => await AccessTokenProvider.GetAccessTokenAsync();
})
.AddMessagePackProtocol()
.Build();
if (startConnection)
{
await connection.StartAsync(cancellationToken);
}
return connection;
}
For the AccessTokenProvider property, I use AccessTokenProvider.GetAccessTokenAsync()
public class AccessTokenProvider(ITokenService tokenService, IHttpContextAccessor httpContextAccessor) : IAccessTokenProvider
{
public async Task<string?> GetAccessTokenAsync()
{
var context = httpContextAccessor.HttpContext;
var accessToken = context.Request.Cookies[CookieNames.AccessToken];
if (!string.IsNullOrEmpty(accessToken) && tokenService.IsTokenValid(accessToken))
{
return accessToken;
}
var refreshToken = context.Request.Cookies[CookieNames.RefreshToken];
if (!string.IsNullOrEmpty(refreshToken) && tokenService.IsRefreshTokenValid(refreshToken))
{
var newTokens = await tokenService.RefreshAccessToken(refreshToken);
if (newTokens != null && !string.IsNullOrEmpty(newTokens.AccessToken))
{
context.Response.Cookies.Append(CookieNames.AccessToken, newTokens.AccessToken);
context.Response.Cookies.Append(CookieNames.RefreshToken, newTokens.RefreshToken);
return newTokens.AccessToken;
}
}
context.Response.Redirect("/Account/Logout");
return null;
}
}
This is done so that the dialog can get the token itself if it has expired and correctly establish a connection. But this does not happen. The token is updated, of course, judging by the logs, but cookies are not set.
As I understand it is related to the interactive rendering mode. Since the same provider token is used in other parts of the application and works correctly when loading the page, but starts these tricks when it is used after rendering.
But I couldn’t fix it in any way at all. Even calling JS Interop to set the cookie doesn’t seem to help.