我试着解决这个问题几个小时了,我找不到任何东西。基本上我有一个简单的控制器,大致如下:
[Route("v1/lists")]
public class ListController : Controller
{
...
[HttpPost("{id}/invite")]
public async Task<IActionResult> PostInvite([FromBody] string inviteSecret, [FromRoute] int id, [FromQuery] string userSecret)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
List list = await context.Lists.SingleOrDefaultAsync(l => l.ID == id);
if (list == null)
{
return NotFound();
}
User postingUser = await context.Users.SingleOrDefaultAsync(u => u.ID == list.CreationUserID);
if (postingUser == null || postingUser.Secret != userSecret)
{
return Forbid();
}
await context.ListInvites.AddAsync(new ListInvite{ListID = id, InviteSecret = inviteSecret});
await context.SaveChangesAsync();
return Ok();
}
....
}
事情是:每当调用此方法并通过return Forbid();
退出时,Kestrel随后会抛出InvalidOperationException
消息
没有配置身份验证处理程序来处理该方案:自动
(当然服务器返回500)。令人感到奇怪的是,我在任何地方都没有进行任何身份验证,并且不会发生任何情况。如果方法离开return Ok();
。我现在真的迷失了,因为如果你试图谷歌这个问题,你会得到解决方案而不是解决方案...对于那些实际上认证并且遇到问题的人。我真的希望这边的人知道如何解决这个问题和/或我能做些什么来找出发生这种情况的原因。
答案 0 :(得分:9)
与SignIn
,SignOut
或Challenge
一样,Forbid
依赖于身份验证堆栈来决定返回&#34的正确方法;禁&#34;响应:一些身份验证处理程序(如JWT承载中间件)返回403响应,而其他身份(如cookie中间件)更喜欢将用户重定向到访问被拒绝页面&#34;。
如果您的管道中没有任何身份验证处理程序,则无法使用此方法。相反,请使用return StatusCode(403)
。