2008-11-30 73 views

回答

13

我不認爲你可以用標準的授權屬性做到這一點,但你可以得到從AuthorizeAttribute自己的屬性,它利用動作列表,允許和允許只是那些操作的訪問。您可以通過www.codeplex.com查看AuthorizeAttribute的來源,瞭解如何執行此操作的想法。如果你這樣做,它可能看起來像:

[AdminAuthorize (Roles = "Administrator", Exempt = "Login, Logout") ] 
public class AdminController : Controller 
{ 
    public ActionResult Login() 
    { 
     return View(); 
    } 

    public ActionResult Login() 
    { 
     return View(); 
    } 

    ... other, restricted actions ... 
} 

編輯:僅供參考,最終我跑過需要做同樣的事情對我自己和我去一個不同的方向。我創建了一個默認的授權過濾器提供程序並應用全局授權過濾器。授權篩選器提供程序使用反射來檢查某個操作或控制器是否應用了特定的授權屬性,如果是,則遵循該屬性。否則,它將應用默認的授權過濾器。這與來自AuthorizeAttribute的PublicAttribute相結合,允許公共訪問。現在,我獲得了默認的安全訪問權限,但可以通過[Public]向操作或控制器授予公共訪問權限。更具體的授權也可以根據需要應用。見我的博客http://farm-fresh-code.blogspot.com/2011/04/default-authorization-filter-provider.html

+0

看起來你是正確的根據http://www.codeplex.com/aspnet/SourceControl/changeset/view/17272我猜這個屬性是在控制器級別應用的,並且從不給這個動作嘗試評估它。 – 2008-11-30 23:13:46

+0

嗯,顯然你不能直接鏈接到codeplex上的源文件。 – 2008-11-30 23:16:10

4

您可以覆蓋控制器

protected override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if ((string)(filterContext.RouteData.Values["action"]) == "Login") 
     { 
      filterContext.Cancel = true; 
      filterContext.Result = Login(); 
     } 
    } 

這工作,但它是一個黑客的OnAuthorization方法。用於測試

滿級代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Mvc.Ajax; 

namespace MvcApplication2.Controllers 
{ 
[HandleError] 
[Authorize] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     ViewData["Title"] = "Home Page"; 
     ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

     return View(); 
    } 


    public ActionResult About() 
    { 
     ViewData["Title"] = "About Page"; 

     return View(); 
    } 


    protected override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if ((string)(filterContext.RouteData.Values["action"]) == "Index") 
     { 
      filterContext.Cancel = true; 
      filterContext.Result = Index(); 
     } 
    } 
} 
} 
+0

這會在[Authorize]屬性之前還是之後調用? – 2008-11-30 23:16:55

1

可能是它不是實際的,但我寫我的自定義屬性:

public class SelectableAuthorizeAttribute : AuthorizeAttribute 
{ 
    public SelectableAuthorizeAttribute(params Type[] typesToExclude) 
    { 
     _typesToExlude = typesToExclude; 
    } 

    private readonly Type[] _typesToExlude; 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     bool skipAuthorization = _typesToExlude.Any(type => filterContext.ActionDescriptor.ControllerDescriptor.ControllerType == type); 

     if (!skipAuthorization) 
     { 
      base.OnAuthorization(filterContext); 
     } 
    } 
} 

然後在我的全球filetrs註冊吧:

filters.Add(new SelectableAuthorizeAttribute(typeof(MyController))); 

希望它對某人有用

23

你可以用[Authorize]來裝飾你的控制器,然後你可以裝飾你想要免除的方法[AllowAnonymous]

相關問題