在动作和控制器中使用不同身份验证方案的Authorize属性的行为是什么

时间:2019-12-14 19:39:57

标签: c# asp.net-core asp.net-core-webapi asp.net-core-2.2

 [Authorize(AuthenticationSchemes = AuthenticationSchemes.CookieAuthenticationScheme)]
public class MyController : ControllerBase
{


    [HttpPost("ui")]
    [ProducesResponseType(
        (int) HttpStatusCode.Created)]
    public async Task Action1()
    {

    }


    [HttpPost]
    [ProducesResponseType(
        (int)HttpStatusCode.Created)]
    [Authorize(AuthenticationSchemes = AuthenticationSchemes.JwtAuthenticationScheme)]
    public async Task Action2()
    {

    }
}

我有一个此控制器,其中Action2具有与Controller中的身份验证方案不同的Authorize属性。但是,当我使用有效的Cookie身份验证但使用无效的身份验证令牌来调用Action2时,那么Action2也会获得授权-我期望得到401 / Unauthorized响应。

这是预期的行为吗?

使用Asp.net core 2.2

1 个答案:

答案 0 :(得分:1)

在ASP.NET Core 2.1之前,所有策略都将单独评估,并且都需要得到满足。

这在ASP.NET Core 2.1中进行了更改,指出此行为是意外的。在该版本中,将合并策略,以便如果至少满足一个策略,则也将满足该请求的授权要求。

该团队在AllowCombiningAuthorizeFilters上公开了一个名为MvcOptions的新资产,以防人们依赖该行为。

请参阅:

如果您想恢复原来的行为,可以在Startup类中使用以下内容:

app.AddMvc(options =>
{
    options.AllowCombiningAuthorizeFilters = false;
});