授权和允许匿名元数据在应用于控制器时会给出不同的行为



>当我应用此代码时 使用控制器授权方法和允许匿名 在其中一个操作方法上,则所有操作方法都将被授权,除了具有允许匿名元数据的方法。 显然,操作方法元数据覆盖了控制器方法中的元数据

[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]操作方法的元数据 则不会AUTHORIZED具有[Authorize]的操作方法

为什么行为不同?

[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]属性的限制时,您希望从字面上绕过授权以允许匿名访问资源,从而使用它。

这在 Micosoft 文档中进行了描述AllowAnonymousAttribute

指定授权属性在授权期间跳过操作和控制器。

此功能也在"备注"部分下的AuthorizeAttribute文档中注明:

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

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

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

正如Microsoft文档中所述,只需对该操作进行[AllowAnonymous]就指定AuthorizeAttribute跳过此操作,即使该操作也声明了授权属性。这是因为我之前说过,[AllowAnonymous]属性的目的是将资源列入白名单并绕过授权,因此在您的两个编码示例中,[AllowAnonymous]属性完全按预期工作,允许匿名访问您的操作,即使它也声明为已授权。

最新更新