未经授权的结果和 PostAsJsonAsync<T> 导致 javascript 错误 Blazor 服务器

Unauthorized result and PostAsJsonAsync<T> causing javascript error Blazor Server

我有一个场景,当登录失败时,Api 必须 return 一个未经授权的结果。但是,来自 await HttpClient.PostJsonAsync(url, credentials); 的序列化导致控制台出现 javascript 错误,导致登录页面无法按预期运行. 这是我的位。

API代码:

    [HttpPost("LoginV2")]
    [SwaggerOperation(Tags = new[] { "Auth" })]
    [ProducesResponseType(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status401Unauthorized)]
    public async Task<IActionResult> LoginV2([FromBody] LoginDto login)
    {
        var result = await _signInManager.PasswordSignInAsync(login.Email, login.Password, false, false);

        if (result.Succeeded)
        {
            var appUser = _userManager.Users.SingleOrDefault(r => r.UserName == login.Email);

            var token = new TokenDto()
            {
                JwtToken = GenerateJwtToken(appUser),
                RefreshToken = GenerateRefreshToken()
            };
            var appUserAuth = new IdentityWithTokenDto()
            {
                ////......Omitted
            };
            return Ok(appUserAuth);
        }
        return Unauthorized();
    }

Blazor 代码:

    async Task SubmitCredentials()
    {
        var result = await Client.PostJsonAsync<IdentityWithTokenDto>(url, credentials);

        loginFailure = string.IsNullOrEmpty(result.Token.JwtToken);
        if (!loginFailure)
        {
            await tokenAuthenticationStateProvider.SetTokenAsync(result.Token.JwtToken, DateTime.Now.AddDays(1));
            Navigation.NavigateTo("/",true);
        }
    }

我不知道如何处理未经授权的结果,因为 httpclient 会处理它,而 blazor javascript 会向控制台抛出一个错误,使登录表单停止工作。 这是正确的行为还是任何正确处理它的方法?

更新: 下面的答案指出了在这种情况下不使用 PostAsJsonAsync<> 并手动转换结果的解决方案。

这是更新后的代码:

       var response = await Client.PostAsJsonAsync(url, credentials);
        if (response.IsSuccessStatusCode)
        {
            var data =  await response.Content.ReadAsAsync<IdentityWithTokenDto>();
            await tokenAuthenticationStateProvider.SetTokenAsync(data.Token.JwtToken, DateTime.Now.AddDays(1));
            Navigation.NavigateTo("/", true);
        }
        else
        {
            //Update the UI
        }

第一个选项当然是更改您的 Action 方法和 return 一个有效的 Dto 结果 .Token.JwtToken == null。然后你的 Blazor 代码可以保持原样。

那将是我的首选方式,登录请求本身不是 'UnAuthorized',它只是被拒绝了。这里的 return Unauthorized(); 很有争议。

如果你还想在客户端处理:你现在无法获取响应状态,因为你直接转换形式Json。你将不得不拆分:

//var result = await Client.PostJsonAsync<IdentityWithTokenDto>(url, credentials);
  var response = await Client.PostAsync(url, credentials);

  if (response.IsSuccessStatusCode)
  {
     string json = await response.Content.ReadAsStringAsync();
     // decode Json with System.Text.Json
  }
  else
  {
      // handle errors / unauth
      if (response.StatusCode == HttpStatusCode.Unauthorized) { ... }

  }