我按照 本指南 在 .net Maui 应用程序中实现 Web 身份验证,效果很好。
我比较纠结的是,如果access_token过期了,如何实现对后端的回调。据我了解原理,目标是使用refresh_token向发行者(谷歌、微软或苹果)请求新的access_token。
我当前的计划是将方案和refresh_token发送到后端方法,该方法由发行者请求access_token。
挑战是,我不知道如何实现该请求。我在网上找到了几个代码片段,它们看起来不错,但就我的理解而言,已经过时了。
是否有人已经实现了这种方法(我很确定是的)并且可以共享代码或链接,我可以在其中找到其他信息?
请查看 Duende.AccessTokenManagement 项目进行令牌管理。没有对此的内置支持,因此要么使用这个库,要么创建自己的库。
这是在 ASP.NET Core 中获取新访问令牌的示例方法:
/// <summary>
/// Get a new access token and refresh token from IdentitytServer and update it in the cookie
/// </summary>
/// <returns></returns>
private string? GetNewAccessToken()
{
var refreshToken = HttpContext.Session.GetString("refresh_token") ?? "";
if (string.IsNullOrEmpty(refreshToken))
return "";
var data = new RefreshCodeFlowLogin();
var url = new Url($"{Settings.OIDCServer}/connect/token");
//Console.WriteLine("Refresh token " + refreshToken);
//Console.WriteLine("ClientId " + data?.client_id?.Trim());
//Console.WriteLine("ClientSecret " + data?.client_secret?.Trim());
var client = new HttpClient();
TokenResponse? response = client.RequestRefreshTokenAsync(new RefreshTokenRequest
{
Address = url,
ClientId = data?.client_id?.Trim() ?? "",
ClientSecret = data?.client_secret?.Trim(),
RefreshToken = refreshToken
}).Result;
//Console.WriteLine("new Refresh token " + response.RefreshToken);
//Console.WriteLine("new access token " + response.AccessToken);
//Save the access and refresh the token in the session cookie
Request.HttpContext.Session.SetString("access_token", response.AccessToken ?? "");
Request.HttpContext.Session.SetString("refresh_token", response.RefreshToken ?? "");
Request.HttpContext.Session.SetString("expires_in", response.ExpiresIn.ToString() ?? "");
return response?.AccessToken;
}
}