ASP.NET MVC - модальное окно для передачи дополнительных учетных данных - PullRequest
0 голосов
/ 08 февраля 2012

В моем приложении у меня есть несколько областей (представлений), которые должны быть доступны только для тех пользователей, которые имеют определенные привилегии. ЕСЛИ зарегистрированный пользователь не имеет права видеть данный вид, должно появиться всплывающее окно. В данный момент пользователь может предоставить некоторую дополнительную информацию, чтобы увидеть вид. Дело в том, что пользователь не может покинуть текущий вид, пока не предоставит эту информацию. Пока я думаю, что смогу сделать это таким образом. Прежде всего, я определил пользовательский 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 голосов
/ 09 февраля 2012

Информация, хранящаяся в ViewData, будет потеряна после перенаправления на другое действие.Если вы хотите, чтобы информация сохранялась, вы можете вместо этого использовать TempData [].

Для более удобного решения ваших требований я бы использовал схему авторизации на основе ролей.В вашем случае ваш контроллер будет проверять, имеет ли пользователь надлежащую роль для просмотра определенных частей страницы, и сохранять эту информацию в ViewData / ViewBag (через User.IsInRole («Администратор») и т. Д.).Ваше представление будет построено на основе информации, содержащейся в ViewData / ViewBag.

Чтобы настроить это, достаточно много работы, вам придется выполнить поиск в Google, чтобы найти подходящие учебные пособия.

Вот один, который я нашел, который кажется хорошим: 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>
...