我想簡單地從一個控制器中的另一個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調用,在日誌中創建一個錯誤命中,並假設如何在整個應用程序中處理授權。
可能存在次要問題 - 頁面可能已被授權,但只是改變它的工作方式或外觀。這個特殊的應用程序基於賬戶(除了賬戶條本身)外觀沒有變化,並且我可以通過提供表單監聽的自定義事件來處理功能更改 - 它們可以從服務器重新加載任何相關數據以響應它。
這些正確的權限在哪裏存儲 – Tassadaque
我將擴展我的問題給出我當前如何定義權限的示例(它是標準的MVC的東西) –