Xamarin.Forms OAuth 令牌身份验证

Posted

技术标签:

【中文标题】Xamarin.Forms OAuth 令牌身份验证【英文标题】:Xamarin.Forms OAuth Token authentication 【发布时间】:2019-08-08 08:03:08 【问题描述】:

我试着按照你的建议去做(在下面回答)。不幸的是我仍然有这个问题。 这是我的新 TokenService.cs: 类令牌服务


    TokenKeeper tokenkeeper;

    public TokenService()
    
        tokenkeeper = new TokenKeeper();
    

    public async void AwaitGetToken()
    
        tokenkeeper = new TokenKeeper();
        tokenkeeper = await GetToken();          
    

    private async Task<TokenKeeper> GetToken()
    
        string stringuri = string.Format("0/token", RestAccess.HostUrl);

        var dict = new Dictionary<string, string>();
        dict.Add("grant_type", "password");
        dict.Add("username", RestAccess.User);
        dict.Add("password", RestAccess.Pass);
        dict.Add("client_id", RestAccess.Client_ID);
        dict.Add("client_secret", RestAccess.Client_secret);

        tokenkeeper=new TokenKeeper();
        var httpclient = new HttpClient();
        try
        
            var req = new HttpRequestMessage(HttpMethod.Post, stringuri)  Content = new FormUrlEncodedContent(dict) ;
            var res = await httpclient.SendAsync(req);
            if (res.IsSuccessStatusCode)
            
                var content = await res.Content.ReadAsStringAsync();
                tokenkeeper = JsonConvert.DeserializeObject<TokenKeeper>(content);
                return tokenkeeper;
            

            return tokenkeeper;
        
        catch
        
            return tokenkeeper;
        
        finally
        
            httpclient.CancelPendingRequests();
            httpclient.Dispose();   
        
    

我的 tokenkeeper 是简单的类:

public class TokenKeeper
    
        public string access_token  get; set; 
        public string refresh_token  get; set; 
        public TokenKeeper()
        
            access_token = "";
            refresh_token = "";
        
    

在我的调用代码中,我的代码如下:

...
tokenservice.AwaitGetToken();  
GetXFMapUserFromAzureAndSetVariable(RestAccess.User);  
_navigationService.NavigateAsync("ZleceniaListContentPage", par);
...

tokenservice.AwaitGetToken() 和 GEtXFMapUserFromAzureAndSetVariable(RestAccess.User) 它们是相似的。两者都在等待,但 tokenservice.AwaitGetToken() 是 POST,而 GEtXFMapUserFromAzureAndSetVariable 是 GET。 GEtXFMapUserFromAzureAndSetVariable 工作正常,但如果我调用 tokenservice.AwaitGetToken() 应用程序会在继续之前获取令牌。最后,指令 GEtXFMapUserFromAzureAndSetVariable 正在完成 tokenservice.AwaitGetToken() 响应。

我如何才能等待调用 GEtXFMapUserFromAzureAndSetVariable 直到收到来自 tokenservice.AwaitGetToken() 的回复???

【问题讨论】:

查看方法定义GetTokenPublic n TokenService 类,我假设你没有等待令牌获取,等待它直到你得到响应。 【参考方案1】:

删除你的AwaitGetToken方法,没用。 现在将 GetToken 方法设为 public 并使用 await 调用它:

await tokenService.GetToken();
await GetXFMapUserFromAzureAndSetVariable(RestAccess.User);
await _navigationService.NavigateAsync("ZleceniaListContentPage", par);

基本上,您总是需要等待返回 Task 的方法,否则它将以并行方式运行,您的代码将失去一致性。

您似乎对Taskasync/await 感到很困惑,我强烈建议您阅读有关它的教程和文档:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/

【讨论】:

我做了这个,但可能是问题,因为我调用 tokenService.GetToken() 的方法是绑定方法,它导航到下一个视图。它被声明为 public void GoToZleceniaListContentPageNavigation()。而且我在使用 await tokenService.GetToken() 时遇到问题 - 这是不正确的。因此我创建了 tokenservice.AwaitGetToken()。我不能那样做吗?此 GetXFMapUserFromAzureAndSetVariable(RestAccess.User) 工作正常。它是相似的。谢谢。 对不起,伙计,我一个字都听不懂。我只能建议您了解有关任务的更多信息。您似乎错过了很多整体逻辑。 非常感谢 :-) 我再次跟踪代码,发现了一个愚蠢的错误。我纠正了它,你所有的提示都有效!!谢谢

以上是关于Xamarin.Forms OAuth 令牌身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms 会话管理

如何在 Xamarin Forms iOS-App 中接收 ASPN 令牌

Xamarin.Auth:使用身份提供者对用户进行身份验证 [xamarin forms - Android]

无法使用 Xamarin.Forms WebView 进行 Dropbox 身份验证

Xamarin Forms Android - 使用 MSAL 库部署时身份验证失败

Xamarin.Forms webview 进行身份验证,导航到新页面(Shell)并需要再次重新验证?