当用户在Blazor WASM应用程序中的会话过期时,我们需要以某种方式通知他们并引导他们重新登录。以下是一种可能的解决方案。
public class SessionService
{
private readonly HttpClient httpClient;
private readonly NavigationManager navigationManager;
private CancellationTokenSource cancellationTokenSource;
private bool isSessionExpired;
public event Func SessionExpired;
public bool IsSessionExpired
{
get { return isSessionExpired; }
private set
{
if (isSessionExpired != value)
{
isSessionExpired = value;
if (value)
{
OnSessionExpired();
}
}
}
}
public SessionService(HttpClient httpClient, NavigationManager navigationManager)
{
this.httpClient = httpClient;
this.navigationManager = navigationManager;
this.cancellationTokenSource = new CancellationTokenSource();
this.httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
public async Task CheckSession()
{
var request = new HttpRequestMessage(HttpMethod.Get, "api/Session/CheckSession");
try
{
var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationTokenSource.Token);
if (response.IsSuccessStatusCode)
{
IsSessionExpired = false;
return true;
}
if (response.StatusCode == HttpStatusCode.Unauthorized)
{
IsSessionExpired = true;
return false;
}
// Handle other HTTP status codes if necessary...
}
catch (OperationCanceledException)
{
// The request was cancelled, likely due to a timeout
}
return false;
}
public void CancelSessionCheck()
{
cancellationTokenSource.Cancel();
IsSessionExpired = true;
}
private async void OnSessionExpired()
{
if (SessionExpired != null)
{
await SessionExpired.Invoke();
}
}
}
@inject SessionService SessionService
Not found
Sorry, there's nothing at this address.
@if (SessionService.IsSessionExpired)
{
Your session has expired. Please { await SessionService.CheckSession(); }">click here to login again.
}
[ApiController]
[Route("api/[controller]")]
public class SessionController : ControllerBase
{
[HttpGet("CheckSession")]
public IActionResult CheckSession()
{
if (User.Identity.IsAuthenticated)
{
return Ok();
}
return Unauthorized();
}
}