我在我的Blazor项目中使用Auth0进行用户登录,并在WebAPI端点中额外对用户进行身份验证,以提供用于后续调用的jwt。这一切都很顺利。
如果用户的Auth0登录过期,用户会被正确地重定向到登录页面。
问题是当jwt过期时。用户仍然在Web应用程序中进行身份验证,但当他们访问WebAPI时,他们会得到一个预期的未经授权(401)的响应。
我希望最终能够实现刷新令牌的代码,但现在我愿意通过重定向到一个注销控制器来强制用户重新进行身份验证。
我尝试过从继承自HttpClientHandler的自定义处理程序进行重定向。
重定向结果为:System.InvalidOperationException: StatusCode 无法设置,因为响应已经开始。
如果用户的Auth0登录过期,用户会被正确地重定向到登录页面。
问题是当jwt过期时。用户仍然在Web应用程序中进行身份验证,但当他们访问WebAPI时,他们会得到一个预期的未经授权(401)的响应。
我希望最终能够实现刷新令牌的代码,但现在我愿意通过重定向到一个注销控制器来强制用户重新进行身份验证。
我尝试过从继承自HttpClientHandler的自定义处理程序进行重定向。
var unauthorizedHandler = new UnauthorizedHandler();
var httpClient = new HttpClient(unauthorizedHandler);
public class UnauthorizedHandler : HttpClientHandler
{
private IHttpContextAccessor _httpContextAccessor;
public void Add(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var response = await base.SendAsync(request, cancellationToken);
if (response.StatusCode == HttpStatusCode.Unauthorized)
{
_httpContextAccessor.HttpContext.Response.Redirect("/Identity/Logout", true);
}
return response;
}
}
重定向结果为:System.InvalidOperationException: StatusCode 无法设置,因为响应已经开始。
我还使用了 NSwag 生成的 C# 客户端,并尝试在 ProcessResponse 部分方法中进行类似的重定向,但是得到了相同/类似的错误消息。
如果我捕获异常并通过 NavigationManager 在实际的 Blazor 页面中进行重定向,它可以正常工作,但是我希望以一种横切的方式处理这个问题。
我如何在 HttpClient 中拦截未经授权的错误并自动重定向?