Kentico 12 - Как настроить отдельную страницу для проверки подлинности? - PullRequest
0 голосов
/ 04 апреля 2019

В Kentico 12 свойство Security внутри страницы не имеет поля Access, как в предыдущей версии Kentico 11 - Доступ к интерфейсу .

Мне нужно предоставить эту функцию, поэтому я подумал об использовании переопределения метода OnAuthentication так:

protected override void OnAuthentication(AuthenticationContext filterContext)
    {
        var isAuthenticated = filterContext.Principal.Identity.IsAuthenticated;
        var routePath = filterContext.HttpContext.Request.Path;
        var page = DocumentHelper.GetDocuments().Path(routePath).FirstOrDefault();
        var allowAccess = (page.HasSecureProperty && isAuthenticated) || !page.HasSecureProperty;
        if (allowAccess)
        {
            base.OnAuthentication(filterContext);
        }
        else
        {
            filterContext.Result = new RedirectToRouteResult(
                  new RouteValueDictionary(new { controller = "Account", action = "Signin" })
            );
        }
    }

HasSecureProperty будет свойством со страницы kentico, которое администраторы или пользователи редакторов могут установить на панели администрирования. Я планировал создать это свойство с помощью пользовательской таблицы и создать интерфейс на странице для пользователей.

Поле IsSecureNode в CMS_Tree, кажется, является тем свойством, которое мне нужно, и оно использовалось в предыдущих версиях, но я не смог найти способ установить его в новой панели администратора.

Есть ли другое решение, позволяющее пользователям устанавливать аутентификацию на страницах? Я был обеспокоен производительностью, поскольку этот метод будет вызываться при каждом действии. Спасибо.

Ответы [ 3 ]

0 голосов
/ 05 апреля 2019

Вы можете использовать подход, упомянутый в документации по авторизации действий сайта в реальном времени .

0 голосов
/ 30 апреля 2019

В итоге я использовал пользовательскую таблицу с интерфейсом, чтобы пользователь мог установить, требует ли страница аутентификации или нет. Поскольку это переопределение OnAuthentication, каждая страница вызывает этот метод. Я надеюсь, что есть лучшее решение, использующее встроенные функции Kentico. Вот окончательный код:

protected override void OnAuthentication(AuthenticationContext filterContext)
    {
        base.OnAuthentication(filterContext);

        var routePath = filterContext.HttpContext.Request.Path;
        var allowAccess = Authentication.CanEnterPage(filterContext.Principal.Identity.IsAuthenticated, routePath);
        if (!allowAccess)
        {
            filterContext.Result = new RedirectToRouteResult(
                    new RouteValueDictionary(new { controller = "Account", action = "Signin", returnUrl = routePath })
            );
        }
    }   

Статический метод ниже содержит логику для доступа к странице:

public static bool CanEnterPage(bool isAuthenticated, string routePath)
    {
        var page = DocumentHelper.GetDocuments().Path(routePath).FirstOrDefault();

        if (page == null)
            return false;

        var pageAccess = PageAccessInfoProvider.GetPageAccesses()
            .WhereEquals("PageAccessNodeID", page.NodeID).FirstOrDefault();

        // Create a record if pageAccess is null
        if (pageAccess == null)
        {
            pageAccess = CreateRecordsPageAccess(page);
        }

        var isSecure = pageAccess.PageAccessHasAuthentication;
        var allowAccess = isSecure && isAuthenticated || !isSecure;
        return allowAccess;
    }
0 голосов
/ 04 апреля 2019

Я сделал нечто подобное, так что, возможно, это поможет вам направить вас в правильном направлении.

Мой весь сайт MVC требует аутентификации, так что в этом может быть различие.В MVC, когда я хочу получить файлы и проверить разрешения, я делаю что-то вроде этого:

var files = subcat.Children.WithAllData.WithPermissionsCheck;

На стороне CMS у меня есть поле на типе страницы, которое позволяет пользователю выбирать роли и еще одну.для выбора пользователей.Затем я обновляю или вставляю пользовательское событие для обновления настроек.

Вот код, который я использую для обновления ACL:

private void UpdateSettings(TreeNode node)
    {
        ObjectQuery<RoleInfo> roles = null;
        ObjectQuery<UserInfo> users = null;
        var columnRoles = node.GetStringValue("Roles", "");
        if (columnRoles != "")
        {
            var rolesConcat = columnRoles.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

            var where = "RoleName IN " + "('" + string.Join("','", rolesConcat) + "')";
            EventLogProvider.LogInformation("Document Event", "Roles", where);
            roles = RoleInfoProvider.GetRoles()
                .Where(where);
        }

        var columnUsers = node.GetStringValue("Users", "");
        if (columnUsers != "")
        {
            var usersConcat = columnUsers.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

            var where = "UserName IN " + "('" + string.Join("','", usersConcat) + "')";
            EventLogProvider.LogInformation("Document Event", "Users", where);
            users = UserInfoProvider.GetUsers()
                .Where(where);
        }

        if (node != null)
        {
            // Gets the ID of the ACL item that stores the page's permission settings
            int nodeACLID = ValidationHelper.GetInteger(node.GetValue("NodeACLID"), 0);

            // Deletes the page's ACL item
            // Removes the page's permission settings for all users and roles
            AclItemInfoProvider.DeleteAclItems(nodeACLID);

            node.IsSecuredNode = true;
            int allowed = DocumentSecurityHelper.GetNodePermissionFlags(NodePermissionsEnum.Read);

            // Prepares a value indicating that no page permissions are denied
            int denied = 0;

            if (users != null)
                foreach (var user in users)
                {
                    // Sets the page's permission for the user (allows the 'Modify' permission)
                    AclItemInfoProvider.SetUserPermissions(node, allowed, denied, user);
                }

            if (roles != null)
                foreach (var role in roles)
                {
                    // Sets the page's permission for the user (allows the 'Modify' permission)
                    AclItemInfoProvider.SetRolePermissions(node, allowed, denied, role);
                }
        }

    }
...