ASP.NET Core在Forbid上给我Code 500()

时间:2017-06-16 20:00:47

标签: c# asp.net asp.net-web-api web asp.net-core

我试着解决这个问题几个小时了,我找不到任何东西。基本上我有一个简单的控制器,大致如下:

[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();。我现在真的迷失了,因为如果你试图谷歌这个问题,你会得到解决方案而不是解决方案...对于那些实际上认证并且遇到问题的人。我真的希望这边的人知道如何解决这个问题和/或我能做些什么来找出发生这种情况的原因。

1 个答案:

答案 0 :(得分:9)

SignInSignOutChallenge一样,Forbid依赖于身份验证堆栈来决定返回&#34的正确方法;禁&#34;响应:一些身份验证处理程序(如JWT承载中间件)返回403响应,而其他身份(如cookie中间件)更喜欢将用户重定向到访问被拒绝页面&#34;。

如果您的管道中没有任何身份验证处理程序,则无法使用此方法。相反,请使用return StatusCode(403)