2013-03-07 82 views
1

在我的MVC應用程序中,我有PlayerCoach對象,並且用戶可以是其中一個。我也有Team對象,我想知道的是我如何防止Players列表中的用戶或TeamCoach獲得對像/Teams/Details/2這樣的路由的訪問,其中2是除了那個他/她是一部分。防止訪問MVC中的路由4

在此先感謝!

+2

只是一個小術語nitpick:你限制accessq到控制器,而不是路由。 – 2013-03-07 17:52:10

+0

@AndrewBarber,以及我仍然需要他們訪問控制器我只是不希望用戶能夠明確地將一個團隊的id傳遞給團隊控制器的Details方法,該方法與團隊的id不同他們是...的一部分... – JM1990 2013-03-08 11:52:28

回答

0

既然要限制一個ID,他們不是的一部分,這似乎是一個情況下,你可以從AuthorizeAttribute繼承並提供實施AuthorizeCore

您的實現可以檢查自己的角色/團隊ID並決定要做什麼/重定向。

public class TeamAuthorize : AuthorizeAttribute 
{ 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
    return UserIsInTeam(httpContext); //whatever code you are using to check if the team id is right  

    } 

} 

您現在可以像應用其他任何屬性一樣應用它。

[TeamAuthorize] 
+0

謝謝你!這聽起來像是理想的解決方案! :) – JM1990 2013-03-08 11:54:02

0

最簡單的解決方案是將URL從使用ID更改爲隨機GUID。你幾乎可以消除猜測另一個有效值的機會。當然,這根據定義並不安全(主要是因爲有人可以從歷史或其他來源獲得其他URL),但在某些情況下,這足夠了。

更好的解決方案是基於IActionFilter接口實現OnActionExecuting方法,並通過使用this.ControllerContext.HttpContext.User.Identity.Namethis.RouteData.Values["id"]檢查ID來創建新的屬性。然後你將這個屬性應用於你的控制器方法。

在我們當前的系統中,我們通過將驗證用戶權限的代碼添加爲每種方法中的第一行來在控制器方法中實施行級安全性。檢查代碼與屬性相同,需要添加相同數量的代碼。這種方法還有另外一個好處 - 比較容易實現的情景,例如教練能夠看到其他團隊的細節但不能修改它們(我們有一個操作和視圖,以便根據權限進行讀取和更新)。

如果您需要到數據庫檢查權限,並且您正在使用IoC框架(例如Ninject,基於構造函數的注入),您還將使用最後一種方法 - 因爲您無法訪問屬性中的這些值。

+0

感謝您的答案!聽起來很值得考慮! – JM1990 2013-03-08 11:56:17