Luc*_*ffi 5 webassembly blazor-client-side
我在使用 blazor 身份验证的客户端令牌时遇到问题。我根据这篇博文实现了身份验证,我正在使用 webassembly 项目。
https://chrissinty.com/securing-your-blazor-apps-introduction-to-authentication-with-blazor/
几乎一切正常,但我遇到了问题。在服务器端,身份验证令牌已过期,但在客户端,我仍然在本地存储上拥有身份验证令牌。我获取本地状态的功能:
public override async Task<AuthenticationState> GetAuthenticationStateAsync()
{
var savedToken = await _localStorage.GetItemAsync<string>("authToken");
if (string.IsNullOrWhiteSpace(savedToken))
{
return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));
}
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", savedToken);
return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity(ParseClaimsFromJwt(savedToken), "jwt")));
}
Run Code Online (Sandbox Code Playgroud)
好吧,查看响应头,我可以看到服务器告诉我我的本地令牌已过期,但我不知道如何在客户端获取此信息。所以我的客户端告诉我我通过了身份验证,但在服务器端我没有。每次我的方法 GetAuthenticationStateAsync 运行以手动清理本地存储的令牌时,我都不想发出测试请求。处理这种行为的最佳方法是什么?我的代码遗漏了什么?
标头响应:“www-authenticate: Bearer error="invalid_token", error_description="The token expired at '02/24/2020 11:52:35'""
谢谢。
Dev*_*ulf 10
我遵循了您所做的相同博客文章,看来我们必须在客户端进行自己的过期检查。在ApiAuthenticationStateProvider客户端,我这样做了:
public override async Task<AuthenticationState> GetAuthenticationStateAsync()
{
var savedToken = await _localStorage.GetItemAsync<string>("authToken");
var anonymousState = new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));
// Not authenticated
if (string.IsNullOrWhiteSpace(savedToken))
{
return anonymousState;
}
var claims = ParseClaimsFromJwt(savedToken);
// Checks the exp field of the token
var expiry = claims.Where(claim => claim.Type.Equals("exp")).FirstOrDefault();
if (expiry == null)
return anonymousState;
// The exp field is in Unix time
var datetime = DateTimeOffset.FromUnixTimeSeconds(long.Parse(expiry.Value));
if (datetime.UtcDateTime <= DateTime.UtcNow)
return anonymousState;
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", savedToken);
return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity(claims, "jwt")));
}
Run Code Online (Sandbox Code Playgroud)
它并不漂亮,但它现在已经完成了工作。
| 归档时间: |
|
| 查看次数: |
1201 次 |
| 最近记录: |