ASP.NET MVC 5应用程序如何针对Web API进行身份验证?

时间:2018-10-04 00:53:44

标签: asp.net-mvc asp.net-web-api asp.net-web-api2 asp.net-identity

问题如下:我们有一个简单的asp.net mvc应用程序,该应用程序使用asp.net身份再次验证oracle 12c实例。一切都按预期进行。但是现在我们被要求构建一个Web API服务来进行身份验证并再次管理所有数据操作。其中包括身份验证,因为其中包含用户凭据。

对Web api的请求是使用post发出的,例如:

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;
}

因此,该方法(在mvc应用程序的AccountController内部)向Web api发出发布请求。

这是网络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通过以下操作方法获取对Web 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);
    }
}

现在的问题是:如何使用此Web api而不是直接集成到oracle数据库来集成身份验证?我的意思是,当我们直接对oracle使用身份验证时,一切都按预期工作(正如您所期望的那样,您可以在_LoginPartial.cshtml视图中看到用户名),但是当我们使用Web api时,我们会收到令牌,但用户根本没有经过身份验证。我知道我丢失了一些东西,但我只是不明白,在这种情况下我找不到任何示例(MVC针对Web api进行身份验证并创建cookie /sessión变量等)

这怎么办?

谢谢。

0 个答案:

没有答案