要做你想要做的事,你不應該控制你的觀點 - 你實際上必須保護你的控制器 - 而不是觀點。你可以通過控制器屬性來完成。類似的東西:
[Authorize]
public class MyController {
}
通過這樣做,你可以保護整個控制器。如果用戶未通過身份驗證,則該控制器內的每個操作都不會響應(具體而言,他們將收到401響應)。您可以通過授權個人用戶或個人角色在下面的例子顯示擴展此:
[Authorize(Users="eestein,JasCav")
public class MyController {
}
[Authorize(Roles="Administrator")]
public class MyController {
}
在你的情況,你可能不希望有它的授權可將整個控制器。那麼,非常好,ASP。NET MVC提供了認證的動作級別控制。所以,你可以這樣做:
public class MyController {
public ActionResult Index() { }
[Authorize(Roles="Administrator")]
public ActionResult Admin() { }
}
使用這個想法,這是你可以控制用戶在頁面上看到的內容。您將要從您的操作中返回部分頁面,以便加載頁面的各個方面。例如,您可能有一個顯示一些正常數據和一些祕密數據的視圖。普通數據可以通過普通頁面返回。祕密數據應作爲頁面內的局部視圖返回。但是,如果發生401,您可以處理它,只是不顯示任何內容。
這是相當直接的做法。 .NET團隊做了很好的設置,你不必單獨檢查控制器中的權限。我希望這有助於你開始。在線搜索有關如何使用授權屬性的更多信息。
更新 在你誰是控制這些權限頁的管理員的情況下,你必須要聰明的你如何設置你的授權屬性。這就是「角色」非常重要的地方(根據我上面的例子)。例如,如果管理員說:「我要將John Doe添加到SpecialUser角色」,那麼John Doe用戶將能夠訪問所有將角色設置爲SpecialUser的操作(如果確實如此在你的系統上扮演一個角色)。
很明顯,你將不得不爲管理員提供一些能夠做到這一點的方法,並且Authorize屬性完全可以做到這一點。要查看誰在頁面上擁有權限,您必須查詢數據庫以查明誰是角色的一部分。這裏有一種思考設置的方法:
- 您可以控制操作的角色。
- 您的管理員控制誰被授予這些角色。
- 您可以隨時查看(通過簡單的查詢)查看誰分配了什麼角色。然後,您可以(通過您對操作角色的瞭解)瞭解誰可以查看網站的哪些部分。
我希望這個澄清(我希望我能夠很好地理解你的問題)。我認爲你想要做的事情是可能的。
更新2 是的,這確實假定您的控制器上有靜態組,並且必須以編程方式添加任何新組。我很想知道什麼樣的用例需要不同的權限類型來即時創建 - 這看起來好像會被濫用。無論如何,我沒有解決方案。
至於如何局部視圖的工作......這是像這樣...
public class ProductController : Controller
{
//
// GET: /Index/
public ActionResult Index()
{
return View();
}
public ActionResult Partial1()
{
return PartialView();
}
[Authorize]
public ActionResult Partial2()
{
return PartialView();
}
}
內,您的Index.aspx的文件,你就會有這樣的事情:
<%= Html.RenderAction("Partial1") %>
<%= Html.RenderAction("Partial2") %>
如果用戶沒有授權,您可以處理第二個RenderAction
,因此該視圖甚至無法顯示。 (您可以在您的控制器中查看。)
希望澄清事情!我正在運行,所以現在我無法再擴展它。
@JasCav謝謝你的回答。我已經在使用[Authorize]屬性。不像你特別說的那樣。我只用它來防止未經授權的訪問。但是,除非我不能完全理解它是如何工作的,否則還有另一個問題。該權限將由該特定頁面的adm設置(這就是爲什麼我使用了Facebook的示例)。我無法看到他希望別人看到而不是檢查數據庫。我怎樣才能返回一個特定的局部視圖?用戶可以擁有字段a和b的權限,或者只有c或任何其他權限。您的解決方案適用於這種情況嗎?再次感謝。 – eestein 2011-03-03 17:53:45
@eestein - 我的解決方案可以適用於您所描述的情況,假設它已正確設置。我現在正在寫一個更新到我的答案 - 一會兒找。 – JasCav 2011-03-03 18:02:02
@JasCav謝謝,我會等。 – eestein 2011-03-03 18:05:00