使用refresh_token在.net MAUI中使用WebAuthenticator

问题描述 投票:0回答:1

我按照 本指南 在 .net Maui 应用程序中实现 Web 身份验证,效果很好。

我比较纠结的是,如果access_token过期了,如何实现对后端的回调。据我了解原理,目标是使用refresh_token向发行者(谷歌、微软或苹果)请求新的access_token。

我当前的计划是将方案和refresh_token发送到后端方法,该方法由发行者请求access_token。

挑战是,我不知道如何实现该请求。我在网上找到了几个代码片段,它们看起来不错,但就我的理解而言,已经过时了。

是否有人已经实现了这种方法(我很确定是的)并且可以共享代码或链接,我可以在其中找到其他信息?

oauth-2.0 maui
1个回答
0
投票

请查看 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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.