Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 授权和异名元数据在控制器上应用时会给出不同的行为_C#_Asp.net Mvc - Fatal编程技术网

C# 授权和异名元数据在控制器上应用时会给出不同的行为

C# 授权和异名元数据在控制器上应用时会给出不同的行为,c#,asp.net-mvc,C#,Asp.net Mvc,当我应用此代码时 使用控制器上的授权方法和AllowAnonymous 在内部的一个操作方法上,所有的操作方法都将被授权,除了在其上具有AllowAnonymous元数据的操作方法。 显然,动作方法元数据正在覆盖来自控制器方法的元数据 [Authorize] public class HomeController : Controller { public ActionResult About() { ViewBag.Message = "Your applic

当我应用此代码时 使用控制器上的授权方法和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]
的操作方法将不会被
授权

为什么行为不同

[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]
属性的限制时,如果您希望真正绕过授权以允许匿名访问资源,则可以使用此选项

以下内容对此进行了描述:

指定在授权期间,AuthorizeAttribute跳过操作和控制器

此功能也在“备注”部分下的上注明:

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

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

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

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

我认为您不需要在控制器级别声明
[AllowAnonymous]
。这就是它开箱即用的方式。可能会明确说明其“优先级”高于操作级别
[Authorize]
。因此,在这种情况下,不要将anon属性添加到控制器,而是根据需要为每个操作添加
[Authorize]
属性。