Я провожу некоторые тесты с приложением Blazor WebAssembly ASP. NET Размещено ядро. Это шаблон в предыдущей версии, который предоставляет решение с тремя проектами: клиент, сервер и общий. В этом решении я использую Entity Framework для доступа к базе данных и Identity Core для выполнения регистрации пользователей и входа в систему.
Для этого я реализовал следующий контроллер.
using BlazorAutoComplete.Shared.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
[Route("api/[controller]")]
[ApiController]
public class AccountController : ControllerBase
{
private readonly UserManager<IdentityUser> _userManager;
private readonly SignInManager<IdentityUser> _signInManager;
private readonly IConfiguration _configuration;
public AccountController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager, IConfiguration configuration)
{
this._userManager = userManager;
this._signInManager = signInManager;
this._configuration = configuration;
}
[HttpGet]
public string Get()
{
return $"AccountController :: {DateTime.Now.ToShortDateString()}";
}
[HttpPost("Login")]
public async Task<ActionResult<UserToken>> Login([FromBody] UserInfo userInfo)
{
var result = await _signInManager.PasswordSignInAsync(userInfo.Email, userInfo.Password, isPersistent: false, lockoutOnFailure: false);
if (result.Succeeded)
{
return await GenerateTokenAsync(userInfo);
}
else
{
return BadRequest(new { message = "Login inválido" });
}
}
У меня также есть метод регистрации на этом контроллере, но это не относится к делу.
Проблема, с которой мне нужна помощь: в режиме разработки работают все службы (вход в систему, регистрация и получение, которое возвращает только одну строку, доступ к которой осуществляется через "api / Счет"). Однако, когда я публикую sh мой проект, работает только этот сервис Get. Когда я пытаюсь получить доступ к API входа в систему, я получаю ответ 404. Not Found.
Вызов метода входа в систему.
@inject HttpClient http
@inject NavigationManager navigation
@inject TokenAuthenticationProvider authStateProvider
async Task FazerLogin()
{
try
{
var loginAsJson = JsonSerializer.Serialize(userInfo);
var httpResponse = await http.PostAsync("api/account/login", new StringContent(loginAsJson, Encoding.UTF8, "application/json"));
if (httpResponse.IsSuccessStatusCode)
{
var responseAsString = await httpResponse.Content.ReadAsStringAsync();
var loginResult = JsonSerializer.Deserialize<UserToken>(responseAsString, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
await authStateProvider.Login(loginResult.Token);
navigation.NavigateTo("/");
}
else
{
loginFalhou = true;
Mensagem = $"Não foi possível realizar o login do usuário. (Erro: {httpResponse.StatusCode})";
}
}
catch (Exception)
{
loginFalhou = true;
Mensagem = $"Não foi possível realizar o login do usuário...";
}
}
Я использовал метод PostAsyn c, чтобы проверить, был ли httpResponse успешный в общении. Но я также пытался реализовать метод следующим образом:
async Task FazerLogin()
{
try
{
var loginResult = await http.PostJsonAsync<UserToken>("/api/account/login", userInfo);
await authStateProvider.Login(loginResult.Token);
navigation.NavigateTo("/");
}
catch (Exception ex)
{
Console.Write(ex);
}
}
Но ошибка остается.
Я понимаю, что Blazor WebAssembly ASP. NET Core Hosted - это шаблон в предыдущей версии. Но я считаю, что проблема в ASP. NET Core 3.1.
Единственное отличие, которое я замечаю между сервисами, заключается в том, что работающий сервис возвращает только одну строку. Логин, регистрация и другие контроллеры возвращают Задачу>. Это проблема? Если да, есть ли другой способ реализовать логин?