令牌到期ASP网络

时间:2018-12-14 15:22:50

标签: c# asp.net-mvc

我正在使用以下方法从ASP网络服务器获取令牌。

public async static Task<bool> GetToken(string username, string password)
{
    var token = new FormUrlEncodedContent(new[]
    {
        new KeyValuePair<string, string>("username", username),
        new KeyValuePair<string, string>("password", password),
        new KeyValuePair<string, string>("grant_type", "password")
    });
    using (var client = new HttpClient())
    {
        client.Timeout = TimeSpan.FromMilliseconds(20000);
        var response = await client.PostAsync(ServerTokenString, token);

        if (response.IsSuccessStatusCode)
        {
            string content = await response.Content.ReadAsStringAsync();
            var tokens = content.Split('"');
            AccessToken = tokens[3];
            TokenType = tokens[7];
            return true;
        }
        return false;
    }
}     

然后我将令牌和令牌类型保存在字符串中。 然后,我使用此令牌进行请求。 但是,如果令牌将过期怎么办?我需要重新发送用户名和密码吗?或者,如果客户已经登录并且其令牌已过期,还有更简便的方法吗?

1 个答案:

答案 0 :(得分:0)

在C#中,一个函数可以具有多个“风味”-根据发送的参数的类型和数量,它将调用“具有该风味”。在查看PostAsync的文档时,我们可以看到以下“风味”。 (https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient.postasync?view=netframework-4.7.2

PostAsync(Uri, HttpContent, CancellationToken)  
  

发送带有取消令牌的POST请求作为异步操作。

PostAsync(String, HttpContent, CancellationToken)   
  

发送带有取消令牌的POST请求作为异步操作。

PostAsync(String, HttpContent)  
  

通过异步操作将POST请求发送到指定的Uri。

PostAsync(Uri, HttpContent)     
  

通过异步操作将POST请求发送到指定的Uri。

如果仔细查看这些内容,我们可以看到前两个参数具有3个参数,并且两个参数中的第三个参数均名为“ CancellationToken”。 (您可以阅读文档的其余部分以了解它们的作用。)

接下来的两个有2个没有令牌的参数。

在通话中,您将传递给以下变量

var response = await client.PostAsync(ServerTokenString, token);

由于要传递两个参数,因此您将在上面的列表中调用第3版或第4版。这意味着它们不是令牌-(即使名称中带有“令牌”)。


您可以这样更改代码: (改编自https://docs.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken?view=netframework-4.7.2

// Define the cancellation token.
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken CToken = source.Token;

var response = await client.PostAsync(ServerTokenString, token, CToken);

但是,这没有用。由于您正在使用await,因此PostAsync将在没有时间使用CancellationToken之前完成。

  

仅当进程在另一个线程上运行时才使用CancellationToken -使用await等待线程完成,因此您从不不需要它。