0

我正在尝试使用登录方法+其他方法编写 API。当登录出现问题时,我想使用自定义响应正文向客户端返回自定义 HTTP 错误代码。问题是在错误时请求被重定向到主页。

[HttpPost]
[AllowAnonymous]
public JsonResult ApiLogIn(LoginModel model)
{
    if (ModelState.IsValid)
    {
        var outcome = _authService.LogIn(model);

        if (outcome == LogInOutcome.Success)
        {
            return Json(new { }); // Empty on success
        }
        else
        {
            Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            return Json(new { reason = outcome.ToString() });
        }
    }

    Response.StatusCode = (int)HttpStatusCode.BadRequest;
    return Json(new { }); // Empty or invalid model
}

如何阻止它在错误时被重定向?

4

1 回答 1

1

问题是在请求生命周期的后期,FormsAuth 模块会检查是否Response.StatusCode为 401,如果是,则重定向到登录页面。

您可以尝试不同的状态代码(例如 403,当然这不太适合您的场景)。另一个选项是延迟设置Response.StatusCode为 401,直到EndRequestGlobal.asax 中的事件。

我通过添加一个标志Context.Items并检查标志的存在解决了这个问题EndRequest

Global.asax.cs - 添加此方法

protected void Application_EndRequest(Object sender, EventArgs e)
{
    if(Context.Items["AjaxPermissionDenied"] is bool) // FormsAuth module intercepts 401 response codes and does a redirect to the login page. 
    {
        Context.Response.StatusCode = 401;
        Context.Response.StatusDescription = "Permission Denied";
        Context.Response.End();
        return;
    }
}

在您的控制器中

[HttpPost]
[AllowAnonymous]
public JsonResult ApiLogIn(LoginModel model)
{
    if (ModelState.IsValid)
    {
        var outcome = _authService.LogIn(model);

        if (outcome == LogInOutcome.Success)
        {
            return Json(new { }); // Empty on success
        }
        else
        {
            Context.Items["AjaxPermissionDenied"] = true;
            return Json(new { reason = outcome.ToString() });
        }
    }

    Response.StatusCode = (int)HttpStatusCode.BadRequest;
    return Json(new { }); // Empty or invalid model
}
于 2013-01-11T14:06:00.430 回答