当我应用此代码
与在控制器方法上授权和AllowAnonymous
在其中一种操作方法上,则除具有AllowAnonymous元数据的一种之外,所有操作方法都将被授权。
显然,动作方法元数据正在覆盖控制器方法中的元数据

[Authorize]
public class HomeController : Controller
{

    public ActionResult About()
    {
        ViewBag.Message = "Your application description page.";

        return View();
    }

    [AllowAnonymous]
    public string Method1()
    {
        return "The secure method";
    }

}


但是当我在控制器方法上用[AllowAnonymous]尝试相反时
并在操作方法上使用[Authorize]元数据
那么带有[Authorize]的操作方法将不是AUTHORIZED

为什么行为不同?

[AllowAnonymous]
public class HomeController : Controller
{

    public ActionResult About()
    {
        ViewBag.Message = "Your application description page.";

        return View();
    }

    [Authorize]
    public string Method1()
    {
        return "The secure method";
    }

}

最佳答案

[AllowAnonymous]属性专门用于将控制器或控制器上的操作列入白名单。当资源受到整个Web应用程序的控制器或全局属性的[Authorize]属性所限制时,当您要字面上绕过授权以允许匿名访问资源时,可以使用此方法。

the Micosoft docs for the AllowAnonymousAttribute中对此进行了描述:


指定授权过程中AuthorizeAttribute跳过动作和控制器。


docs for the AuthorizeAttribute的“备注”部分也记录了此功能:


您可以为每个动作声明多个AuthorizeAttribute。您还可以使用AllowAnonymousAttribute禁用特定操作的授权。


因此,在问题的两个编码示例中,您的操作Method1应用了action属性,并且应用了控制器继承属性,因此,这两个示例与执行此操作完全相同:

[AllowAnonymous]
[Authorize]
public string Method1()
{
    return "The secure method";
}


正如Microsoft文档中所述,即使对该动作也声明了Authorize属性,对该动作仅使用[AllowAnonymous]即可指定该动作被AuthorizeAttribute跳过。这是由于我之前说过,[AllowAnonymous]属性的意图是将资源列入白名单并绕过授权,因此在您的两个编码示例中,[AllowAnonymous]属性通过允许匿名访问您的代码而完全按预期工作即使已声明也被授权也可以采取行动。

关于c# - 当将Authorize和AllowAnonymous元数据应用于 Controller 时,它们会表现出不同的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59575947/

10-10 07:28