2011-06-25 41 views
3

我想簡單地從一個控制器中的另一個URL是否被授權檢查。ASP.Net MVC:檢查URL被授權

因此,例如,我想打電話到控制器中,像這樣:

[HttpPost] 
public ActionResult IsUrlAuthorized(string url) 
{ 
    bool isAuthorized = // What do I put here? 
    return Json(isAuthorized); 
} 

所以我想知道我可以打電話來檢查當前用戶是否被授權傳遞是否在URL中。我猜測答案與路線有關,MVC之外有一些位置?

這是一個有點類似的問題,但不完全一樣的事情: ASP.NET MVC. Check if user is authorized from JavaScript

由於用戶可能會或可能不會在一般授權,但可能沒有正確的權限或角色分配查看特定網址。

想法?

更新:我使用標準的MVC授權屬性來鎖定我的應用程序,所以我就放棄的東西,看起來像這裏的例子。在MVC路線中映射到控制器。上的控制器的單個方法可以被限制爲一個或多個角色:

public class HomeController : Controller 
{ 
    [Authorize(Roles = "User, Moderator")] 
    public ActionResult ListRecentPosts() 
    { 
     . . . 
    } 
} 

或者,整個控制器可以被限制爲一個或多個角色:

[Authorize(Roles = "Admin")] 
public class AdminController : Controller 
. . . 

的實際URL,任何的這些控制器方法響應基於默認映射在一個標準的MVC應用程序:

routes.MapRoute("Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

但是,你可以對用戶友好,並加入了更多的途徑讓網址猜測的 - 作爲AR一個Controller方法可以有許多指向它的名字。您不能僅僅假設並從URL推斷出控制器名稱(即使它以這種方式映射網站中一半的URL)。

所以大概我需要一種方法來直接詢問路由引擎是否授權給當前用戶的URL,或者是詢問路由引擎的哪個控制器和方法的兩個步驟,然後詢問是否授權 - 希望不要直接使用Reflection和匹配角色,因爲這會再次假設太多。

更新2:此想出的方法是我有一個帳戶帶在我的應用程序的頂部。其狀態可以通過選擇您授權的幾個帳戶之一進行更改。根據您在應用程序中的位置,您選擇的帳戶可能有權查看此頁面 - 而且您可能正在填寫您不想丟失的表單。所以,天真的方法 - 當他們選擇其他帳戶只刷新 - 是有害的,並且用戶的浪費時間,即使是沒有形式和他們只是在閱讀頁面的所有文本。

儘管對用戶的便利性很好,但用戶會公平地認爲他們無法看到的不應該擁有權限的用戶的頁面確實遭到拒絕(並且,將它們留在一個被禁止的頁面 - 從它取得的行動將失敗)。所以我需要知道是否根據他們的新權限重定向。

一個我喜歡的.Net的事情就是這樣,它的許多最好的圖書館分解這麼好,所以你可以很容易地重構的東西,是其正常功能的一部分,或者一個新的轉折。路由模塊和MVC似乎構建得非常好,所以我不得不懷疑這可以完成。

廉價黑客是爲了確保我的授權模塊在用戶未被授權時返回一致的重定向狀態碼,以及當用戶在帳戶條中更改其帳戶時,激發2個AJAX呼叫:一個更改帳戶,然後通過AJAX第二個到當前頁面來檢查HTTP狀態碼。 200 OK表示按原樣離開頁面,重定向表示按照重定向。顯然,這有點難看,需要額外的HTTP調用,在日誌中創建一個錯誤命中,並假設如何在整個應用程序中處理授權。

可能存在次要問題 - 頁面可能已被授權,但只是改變它的工作方式或外觀。這個特殊的應用程序基於賬戶(除了賬戶條本身)外觀沒有變化,並且我可以通過提供表單監聽的自定義事件來處理功能更改 - 它們可以從服務器重新加載任何相關數據以響應它。

+0

這些正確的權限在哪裏存儲 – Tassadaque

+0

我將擴展我的問題給出我當前如何定義權限的示例(它是標準的MVC的東西) –

回答

4

使用UrlAuthorization.CheckUrlAccessForPrincipal只有當你只使用URL授權的作品。但對於使用路由的MVC,我們強烈建議您不要使用URL授權來保護應用程序。

相反,我們建議在控制器類上使用授權屬性。原因是可能有多個URL調用相同的控制器操作。在資源上保護資源總是更好,而不僅僅是以入口方式。

在這種特殊情況下,您必須獲得給定URL的控制器實例。這有點棘手,因爲你基本上必須從擁有URL的地方運行MVC流水線到擁有控制器的點。這是可能的,但似乎重量級。

我不知道是否沒有更好更簡單的方法來實現您的目標。你真的想做什麼?

更新:根據你的情況,這聽起來像這是一個初始檢查只是爲了UI的目的。也許你需要做的只是向URL發出異步Ajax請求並檢查HTTP狀態碼。如果它是401狀態碼,則知道該用戶未被授權。這似乎是最安全的賭注。

+0

我會更多地解釋這個問題來解釋目標。 –

-1

如何UrlAuthorizationModule.CheckUrlAccessForPrincipal方法。

UrlAuthorizationModule.CheckUrlAccessForPrincipal Method (System.Web.Security)

+0

從來沒有嘗試過,但它會在授權不騎典型的ASP.NET映射到文件funk-schwa,但是需要計算路由並找出哪個控制器和動作在起作用? –

+0

創建默認的mvc3解決方案,以及Home/Index.cshtml編寫@ UrlAuthorizationModule.CheckUrlAccessForPrincipal(「〜/ Account/ChangePassword」,User,「GET」)。allways true!嗯,對不起,不工作。 – takepara

+0

UrlAuthorizationModule.CheckUrlAccessForPrincipal未檢查授權屬性... – takepara