2012-06-18 105 views
3

我有一個ASP.NET MVC網站,我已經建立了一個權限系統。例如,有些鏈接在當前用戶權限不足時隱藏。但是,如果他們手動輸入該鏈接的URL,他們仍然可以訪問該內容。限制訪問MVC操作

我知道我可以使用[Authorize]屬性來防止沒有正確用戶角色的用戶,但是如何實現我自己的屬性來阻止不符合自定義要求的用戶的操作,而無需在內部編寫手動檢查每個這些行動?

回答

9

你可以寫一個自定義的Authorize屬性和覆蓋AuthorizeCore方法,你可以把你的自定義授權邏輯:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var authroized = base.AuthorizeCore(httpContext); 
     if (!authroized) 
     { 
      return false; 
     } 

     // at this stage the base authorization process has passed. 
     // now implement your custom authorization logic and return true or false 

     // here you have access to the HttpContext and as a consequence to all 
     // request and route parameters so you could implement any 
     // authorization logic you want 

     // And of course if you want a completely custom authorization logic 
     // ignoring the base functionality don't call the base method above 
     // but completely override anything here 
    } 
} 

現在,所有剩下的是裝飾與此自定義屬性相應的控制器/行動。

+0

Thanks Darin。唯一的問題是我的過濾器可能需要與AuthorizeAttribute(兩個屬性都使用但具有不同的值)結合使用。直接從'FilterAttribute'派生出現問題嗎? –

+0

是的,您可以從'FilterAttribute'派生,並通過將自定義授權邏輯放入'OnAuthorization'方法來實現'IAuthorizationFilter'接口。 –

0

如果您使用的是ASP.NET Membership,則可以配置RoleProvider併爲您的用戶提供角色。

然後,您可以使用AuthorizeAttribute上的Roles屬性來檢查角色。

[Authorize(Roles="Admin, SuperUser")] 
+1

謝謝,我正在使用ASP.NET Membership和Authorize屬性。但是,既不回答上面關於處理自定義標準的問題。 –

+0

它不怎麼樣?你正在尋找繼承MembershipProvider。查看也繼承RoleProvider,並將其添加爲web.config中的RoleManager。這樣,你做自己的角色,並重定向到一個'訪問被拒絕'或任何如果你不想讓他們在那裏 – Phil

+0

嗯,我沒有看繼承MembershipProvider。我只是想提供類似的功能,除了一些自定義邏輯不直接映射到我的用戶角色列表。而且我沒有選擇直接映射到我的角色,因爲我也在使用成員角色。 –