0

在我的應用程序中,我有幾個區域(視圖),只有具有特定權限的用戶才能訪問這些區域(視圖)。如果當前登錄的用戶沒有權利看到給定的視圖,應該出現一個彈出窗口。在這一刻,用戶可以提供一些額外的信息,以便查看視圖。重點在於用戶不能離開當前視圖,直到他/她提供此信息。到目前爲止,我認爲我可以這樣做。首先我定義了自定義的AuthorizeAttribute。該屬性應用於負責保護受限視圖的控制器。我的屬性看起來像這樣ASP.NET MVC - 傳遞附加憑證的模式窗口

public class PopupAuthorizeAttribute : AuthorizeAttribute 
    { 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 

      if (filterContext.HttpContext.Session["confirmed"] == null) 
      { 
       filterContext.Controller.ViewData["ShowPopup"] = true; 
      } 
      else 
       filterContext.Controller.ViewData["ShowPopup"] = false; 
     } 
    } 

接下來我修改_Layout.cshtml看這樣

... 
... 
<body> 
    <div id="main"> 
      @{ 
       if ((ViewData[ShowPopup] != null && (bool)ViewData[ShowPopup])) 
       { 
       <script type="text/javascript"> 
        showPopUp(); 
       </script> 
       } 
      } 
     <div id="header"> 
      title 
     </div> 
     <div id="menu"> 
      @{ 
       Html.RenderAction("TopMenu", "Menu"); 
      } 
     </div> 
     <div id="treeView"> 
      @{ 
       Html.RenderAction("TreeMenu", "Tree"); 
      } 
     </div> 
     <div id="content"> 

      @RenderBody() 
     </div> 
    </div> 
</body> 
... 
... 

可惜的是,結果比我預料的不同。現在,渲染用戶無法訪問的視圖並顯示彈出窗口。我想當前視圖重定向到前一個在我的自定義屬性做這樣的

public class PopupAuthorizeAttribute : AuthorizeAttribute 
     { 
      public override void OnAuthorization(AuthorizationContext filterContext) 
      { 

       if (filterContext.HttpContext.Session["confirmed"] == null) 
       { 
        filterContext.Controller.ViewData["ShowPopup"] = true; 
        filterContext.Result = 
        new RedirectResult(filterContext.RequestContext.HttpContext.Request.UrlReferrer.ToString()); 

       } 
       else 
        filterContext.Controller.ViewData["ShowPopup"] = false; 
      } 
     } 

做某事但如果我這樣做,我losse存儲在ViewData的信息。有沒有任何優雅或更好的方法來實現這一功能。不幸的是,我無法將用戶重定向到「正常」頁面,這必須在popupwindow中完成。

回答

0

存儲在ViewData中的信息在重定向到另一個操作後將丟失。如果您希望信息持續存在,則可以使用TempData []。

然而,爲了更好地維護您的需求,我將使用基於角色的授權方案。在你的情況下,你的控制器會檢查用戶是否有正確的角色來查看頁面的某些部分,並將這些信息存儲在ViewData/ViewBag中(通過User.IsInRole(「Administrator」)等)。您的視圖將基於ViewData/ViewBag中的信息構建自己。

要設置這是相當一部分工作,你將不得不做一些谷歌搜索找到適當的教程。

這是一個我發現,似乎不錯: http://weblogs.asp.net/scottgu/archive/2006/07/23/Recipe_3A00_-Implementing-Role-Based-Security-with-ASP.NET-using-Windows-Authentication-and-SQL-Server.aspx

簡而言之web.config文件需要有類似於下面的東西,當你完成:

<roleManager enabled="true" defaultProvider="YourRoleProvider"> 
     <providers> 
      <clear /> 
      <add name="YourRoleProvider" 
       applicationName="YourApplicationName" 
       type="YourProject.Models.YourRoleProvider" 
       connectionStringName="YourDatabaseConnectionString" /> 
     </providers> 
    </roleManager> 
+0

主要得益於我的角色就​​像一個角色提供者。真正的問題是找出如何顯示popWindow的方式。正常的角色提供程序我將被重定向到登錄頁面,但我想在當前視圖上顯示一個彈出窗口 – Berial 2012-02-08 21:05:34

+0

實際上,重定向和登錄身份驗證由您的MembershipProvider處理。有很多方法可以在視圖上顯示「彈出」窗口,我更關心如何確定「彈出」窗口是否應顯示在我的答案中。顯示模式彈出窗口的一種方法是使用jQuery UI庫。裏面有Dialog控件,我用它之前它很好。 – 2012-02-08 21:16:36