Asp.NET核心控制器操作在发布时返回404

时间:2018-03-19 19:02:23

标签: c# authentication asp.net-core url-routing

我有一个使用MVC的ASP.NET Core应用程序,我最近添加了身份验证。它在本地测试时工作正常,但在我发布应用程序并将其安装在另一台服务器上之后,登录方法总是返回404错误。

奇怪的是,只有登录方法有这个问题 - 如果我打开Postman并向其他API方法发出请求,它将返回401 Unauthorized(正如预期的那样,因为我没有登录)所以我知道我有正确的URL,但它仍然返回404。

Login方法的编写与其他方法完全相同,唯一的区别是它在属性中有[AllowAnonymous]而不是[Authorize]。

我注意到的另一个奇怪之处是它在返回404错误之前需要相当长的时间(~30秒)。对其他控制器的请求没有相同的延迟。

这一切都没有任何意义 - 当同一个控制器上的另一个方法被正确路由时,为什么该方法会失败?为什么会出现404错误?为什么它可以在我的本地机器上运行?

登录控制器:

[Produces("application/json")]
[Route("api/[controller]")]
public class LoginController : Controller
{
    private readonly ILoginService _service;
    private readonly CustomTokenOptions _tokenOptions;
    private readonly IMemoryCache _memoryCache;

    public LoginController(ILoginService service, IMemoryCache memoryCache, IConfiguration configuration)
    {
        _service = service;
        _tokenOptions = new CustomTokenOptions();
        configuration.GetSection("TokenAuthentication").Bind(_tokenOptions);
        _memoryCache = memoryCache;
    }
    [AllowAnonymous]
    [HttpPost("[action]")]
    public IActionResult GetToken()
    {
        //Returns a JWT token
        //This method returns a 404 Not Found
    }

    [Authorize(Policy="AllowedGroups")]
    [HttpPost("[action]")]
    public IActionResult Logout()
    {
        //This method works
    }
}

客户代码:

var basePath = $("base").first().attr("href");

function login() {
  $("#btnLogin").attr("disabled", true);
  username = $("#username").val();
  password = $("#password").val();
  request = $.ajax({
    url: basePath + "api/Login/GetToken",
    async: true,
    type: "POST",
    headers: {
      username: username,
      password: password
    }
  });

function logout() {
  request = $.ajax({
    url: basePath + "api/Login/Logout",
    async: true,
    type: "POST",
    headers: {
      "Authorization": "Bearer " + self.token()
    }
  }).then(function () {
    self.loggedIn(false);
    self.token("");
  });
}

我为调试目的尝试过的其他事情:

  • 删除GetToken()方法的内容并将其替换为return StatusCode(200);这意味着GetToken方法中没有任何内容可以解决错误。

  • 在我的代码中注释掉UseAuthenticationAuthorize语句。验证关闭后仍会出现错误。

  • 将GetToken方法重命名为其他方法。

1 个答案:

答案 0 :(得分:0)

@WictorZychla回答。构造函数中的LoginService失败,因此错误发生在控制器操作之前。