未经授权的结果和 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) { ... }
}
我有一个场景,当登录失败时,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) { ... }
}