我有一个使用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方法中没有任何内容可以解决错误。
在我的代码中注释掉UseAuthentication
和Authorize
语句。验证关闭后仍会出现错误。
将GetToken方法重命名为其他方法。
答案 0 :(得分:0)
@WictorZychla回答。构造函数中的LoginService失败,因此错误发生在控制器操作之前。