ASP.NET MVC — модальное окно для передачи дополнительных учетных данных

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


person Berial    schedule 08.02.2012    source источник


Ответы (1)


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

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

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

Вот один из них, который мне кажется хорошим: использование-Windows-Authentication-and-SQL-Server.aspx" rel="nofollow">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>
person Bojin Li    schedule 08.02.2012
comment
в основном благодаря моему атрибуту я делаю что-то вроде поставщика ролей. Истинная проблема заключается в том, чтобы выяснить, как показать popWindow. В обычном поставщике ролей меня перенаправят на страницу входа, но я хочу показать всплывающее окно в текущем представлении. - person Berial; 09.02.2012
comment
На самом деле аутентификация перенаправления и входа в систему обрабатывается вашим MembershipProvider. Есть несколько способов показать всплывающее окно в представлении, меня больше интересовало, как определить, должно ли всплывающее окно отображаться в моем ответе. Один из способов показать модальное всплывающее окно — использовать библиотеку пользовательского интерфейса jQuery. В нем есть диалоговое управление, я использовал его раньше, это довольно приятно. - person Bojin Li; 09.02.2012