ASP.NET MVC - 用于传递其他凭据的模式窗口

时间:2012-02-08 18:42:45

标签: asp.net-mvc model-view-controller authorization modal-window

在我的应用程序中,我有几个区域(视图),只有具有某些特权的用户才能访问这些区域。如果当前登录的用户无权查看给定视图,则应显示弹出窗口。在这一刻,用户可以提供一些额外的信息,以便查看视图。关键是用户不能离开当前视图,直到他/她提供此信息。到目前为止,我认为我可以这样做。首先,我定义了自定义AuthorizeAttribute。此属性应用于控制器,该控制器负责保护受限制的视图。我的属性看起来像这个

 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;
            }
        }

但是,如果我这样做,我会丢失存储在ViewData中的信息。是否有任何优雅或更好的方法来实现此功能。不幸的是,我无法将用户重定向到“普通”页面,这必须在弹出窗口中完成。

1 个答案:

答案 0 :(得分: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>