Dot-Net

覆蓋 ASP.NET MVC 中的授權屬性

  • April 14, 2009

我有一個 MVC 控制器基類,我在其上應用了 Authorize 屬性,因為我希望幾乎所有的控制器(以及它們的動作)都被授權。

但是,我需要一個控制器和另一個未經授權的控制器的操作。我希望能夠用[Authorize(false)]或其他東西來裝飾它們,但這不可用。

有任何想法嗎?

似乎 ASP.NET MVC 4 通過添加AllowAnonymous屬性“修復”了這個問題。

大衛海登寫道

[Authorize]
public class AccountController : Controller
{
   [AllowAnonymous]
   public ActionResult Login()
   {
       // ...
   }

   // ...
}

編輯:由於 ASP.NET MVC 4,最好的方法就是使用內置的AllowAnonymous屬性。

下面的答案是指早期版本的 ASP.NET MVC

您可以使用可選的 bool 參數創建從標準 AuthorizeAttribute 繼承的自定義授權屬性,以指定是否需要授權。

public class OptionalAuthorizeAttribute : AuthorizeAttribute
{
   private readonly bool _authorize;

   public OptionalAuthorizeAttribute()
   {
       _authorize = true;
   }

   public OptionalAuthorizeAttribute(bool authorize)
   {
       _authorize = authorize;
   }

   protected override bool AuthorizeCore(HttpContextBase httpContext)
   {
       if(!_authorize)
           return true;

                   return base.AuthorizeCore(httpContext);
   }
}

然後您可以使用該屬性裝飾您的基本控制器:

[OptionalAuthorize]
public class ControllerBase : Controller
{
}

對於任何不需要授權的控制器,只需使用帶有“假”的覆蓋 - 例如

[OptionalAuthorize(false)]
public class TestController : ControllerBase
{
   public ActionResult Index()
   {
       return View();
   }
}

引用自:https://stackoverflow.com/questions/746998