0

我有一种登录方法,如下所示:

public async Task<ActionResult> Index(LoginModel loginModel)
{
    string url = "API_URL";

    var response = await client.PostAsJsonAsync(url, loginModel);

    if (response.IsSuccessStatusCode)
    {
        string result = await response.Content.ReadAsStringAsync();
        var jsonData = JObject.Parse(result);

        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization", "Bearer " + jsonData["accessToken"]);

        return RedirectToAction("PostLogin");
    }
    else
    {
        ModelState.AddModelError("", "These credentials does not work. Hmm..");
    }

    return View(loginModel);
}

现在,如果用户成功登录,那么我将获得令牌,并且我将其设置在标题中。现在,我将用户重定向到 PostLogin 方法。

但是在那种方法中,我无法访问该令牌。下面是代码。

public async Task<ActionResult> PostLogin()
{
    var accessToken = await HttpContext.GetTokenAsync("accessToken"); // Here I can't see token. and getting value as per below.

    return View();
}

即使我收到此错误,如下所示:

InvalidOperationException: No authenticationScheme was specified, and there was no DefaultAuthenticateScheme found. The default schemes can be set using either AddAuthentication(string defaultScheme) or AddAuthentication(Action<AuthenticationOptions> configureOptions).

4

1 回答 1

1

您已经评论说,在控制器开始时,您拥有HttpClient client = new HttpClient();的新实例是HttpClient

因此,在您的函数中,您正在使用以下行设置对象授权client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization", "Bearer " + jsonData["accessToken"]);

之后,您将从当前获得用户授权,每次用户访问某个链接时都会发送该授权,并且它与您刚刚设置授权的对象HttpContext没有任何关系。client

由于您正在重定向,因此您必须更改当前HttpContext授权标头,因为它将被带到重定向的请求中。通过改变来做到这一点HttpContext.Request.Headers["Authorization"]。问题是它只会持续该请求,因此您需要将令牌返回给客户端,以便他在每次发出请求时将其发送到标头中。

于 2021-09-29T08:40:50.983 回答