来自 Program.cs 的简单脚手架个人身份验证,:
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
// ...
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller}/{action=Index}/{id?}");
控制器:
[ApiController]
[Route("/api/myresource")]
public class MyResourceController : ControllerBase {
// ...
[Authorize]
[HttpGet("dummy")]
public IActionResult GetDummy()
{
return Ok(new Dummy());
}
当我获取 /api/myresource/dummy 时,它返回 HTTP 404 而不是 HTTP 401。
用例:
如果我注释掉
[Authorize]
属性:工作正常,返回虚拟数据(所以我认为路由到位并且有效)
如果
[Authorize]
属性到位并且我登录:工作正常,返回虚拟数据(所以我想路由到位并且工作)
如果
[Authorize]
属性到位并且我 not 登录:返回 HTTP 404 而不是 HTTP 401,甚至没有调用该方法。
问题
我希望 API 返回 HTTP 401。我想这应该是开箱即用的,所以我做错了什么。我错过了什么?