Как приложение ASP.NET MVC 5 может проходить проверку подлинности на основе веб-API? - PullRequest
0 голосов
/ 04 октября 2018

Проблема в следующем: у нас есть простое приложение mvc asp.net, которое использует удостоверение asp.net для аутентификации против экземпляра oracle 12c.Все работает как положено.Но теперь нас просят создать сервис Web API для аутентификации и управления всеми операциями с данными.Это включает в себя проверку подлинности, потому что на нем присутствуют пользовательские учетные данные.

Запросы к веб-API выполняются с использованием сообщения, например:

private string MakePostRequest(LoginViewModel model)
{
    string response = string.Empty;

    WebRequest request = WebRequest.Create(requestUriString: "http://localhost:23346/api/login/authenticate");

    request.Method = "POST";
    request.ContentType = "application/json; charset=utf-8";

    string parameters = "{\"Username\":\"" + model.Email + "\",\"Password\":\"" + model.Password + "\"}";

    request.ContentLength = parameters.Length;

    using (var requestWriter = new StreamWriter(request.GetRequestStream()))
    {
        requestWriter.Write(parameters);
        requestWriter.Close();
    }

    using (var responseReader = new StreamReader(request.GetResponse().GetResponseStream())) {
        response = responseReader.ReadToEnd();
    }

    return response;
}

Итак, этот метод (который находится внутри AccountController вприложение mvc) отправляет запрос на публикацию в web api.

Это метод внутри контроллера web api (называемый LoginController):

[HttpPost]
[Route("authenticate")]
public async Task<IHttpActionResult> Authenticate(LoginRequest login)
{
    if (login == null)
        throw new HttpResponseException(HttpStatusCode.BadRequest);

    var result = await SignInManager.PasswordSignInAsync(login.Username, login.Password, isPersistent: true, shouldLockout: false);

    if (result.Equals(SignInStatus.Success))
    {
        var token = TokenGenerator.GenerateTokenJwt(login.Username);

        return Ok(token);
    }
    else
    {
        return Unauthorized();
    }
}

Наконец ... в приложении mvc,AccountController получает результат запроса на публикацию в веб-API с помощью метода действия следующим образом:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    var resultado = MakePostRequest(model);

    if (!string.IsNullOrEmpty(resultado))
    {
        FormsAuthentication.SetAuthCookie(model.Email, true);

        var aut = HttpContext.User.Identity.IsAuthenticated;

        return RedirectToLocal(returnUrl);
    }
    else
    {
        ModelState.AddModelError("", "Intento de inicio de sesión no válido.");
        return View(model);
    }
}

Теперь вопрос: как я могу интегрировать аутентификацию, используя этот веб-API, а не напрямую в базу данных Oracle??Я имею в виду, что когда мы используем аутентификацию напрямую для oracle, все работает как положено (вы можете видеть имя пользователя в представлении _LoginPartial.cshtml, как и ожидалось), но когда мы используем веб-API, мы получаем токен, но пользователь вообще не аутентифицируется,Я знаю, что что-то упустил, но я просто не понимаю, и я не нахожу ни одного примера по этому сценарию (MVC аутентифицируется на веб-API и создает переменную cookie / sessión и т. Д.)

Как это можно сделать?

Заранее спасибо.

...