我正在努力让Blazor服务器端应用程序中的身份验证按预期工作。
我一直在遵循这个文档,并添加了注册的范围服务:ASP.NET Core Blazor Server additional security scenarios
在_Host.cshtml
中,我从HttpContext中获取令牌:
var tokens = new InitialApplicationState
{
AccessToken = await HttpContext.GetTokenAsync("access_token"),
RefreshToken = await HttpContext.GetTokenAsync("refresh_token"),
IdToken = await HttpContext.GetTokenAsync("id_token"),
ExpiresAtUtc = expiryTime.UtcDateTime,
};
然后将它们传递给App.razor
。
protected override Task OnInitializedAsync()
{
var shouldSetInitialValues = TokenProvider.AccessToken is null || TokenProvider.RefreshToken is null;
if (shouldSetInitialValues)
{
TokenProvider.AccessToken = InitialState!.AccessToken;
TokenProvider.RefreshToken = InitialState.RefreshToken;
TokenProvider.IdToken = InitialState.IdToken;
TokenProvider.ExpiresAtUtc = InitialState.ExpiresAtUtc;
}
return base.OnInitializedAsync();
}
我遇到的问题是,有时HttpContext中的AccessToken已经过期。发生这种情况时,我只想刷新令牌。我有适当的代码来确保当AccessToken存在时令牌是有效的。
但是每次发送新请求时,或者导航到不同的页面时,TokenProvider
都会被清除,因此shouldSetInitialValues
始终设置为true。然后,过期的AccessToken总是传递到TokenProvider
。
AccessToken过期后如何更新?
2条答案
按热度按时间a1o7rhls1#
我通过更新存储在HttpContext中的令牌来解决这个问题。首先,我试图用一个新创建的剃刀页面来做这件事,但后来在重定向用户时遇到了一些问题。
最后,我将更新令牌的逻辑直接放在_Host中。cshtml。
编辑:
在_Host中。cshtml检查令牌是否过期:
方法RefreshAccessTokenAsync()看起来像这样:
希望这有帮助!
k5hmc34c2#
以下中间件可用于续订令牌。
这是我如何配置我的身份验证: