Kentico 12 - 如何将单个页面设置为需要身份验证?
Posted
技术标签:
【中文标题】Kentico 12 - 如何将单个页面设置为需要身份验证?【英文标题】:Kentico 12 - How to set individual page to require authentication? 【发布时间】:2019-08-26 14:59:25 【问题描述】:在 Kentico 12 上,Page 内的属性 Security 不像以前的版本 Kentico 11 - Interface Access 那样具有 Access 字段。
我需要提供这个功能,所以我在考虑像这样覆盖 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 页面中管理员或编辑用户可以在管理面板上设置的属性。我打算使用自定义表创建此属性,并在页面上为用户创建一个界面。
CMS_Tree 上的 IsSecureNode 字段似乎是我需要的属性,并且在以前的版本中使用过,但我找不到在新管理面板上设置的方法。
是否有其他解决方案允许用户在页面上设置身份验证?我担心性能,因为每个动作都会调用这个方法。谢谢。
【问题讨论】:
【参考方案1】:我做过类似的事情,所以也许它会帮助你指出正确的方向。
我的整个 MVC 站点都需要身份验证,所以这可能是不同的地方。在 MVC 中,当我想获取文件并检查权限时,我会执行以下操作:
var files = subcat.Children.WithAllData.WithPermissionsCheck;
在 CMS 方面,我在页面类型上有一个字段,允许用户选择角色,另一个字段用于选择用户。然后我在文档更新或插入时有一个custom event 以更新设置。
这是我用于更新 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);
【讨论】:
感谢分享,但我想我的问题是在权限之前。我需要让用户决定哪些页面需要身份验证,例如在 kentico 11 中,无需新部署。【参考方案2】:您可以使用authorizing live site actions 上的文档中提到的方法。
【讨论】:
不幸的是,这种方法太静态了,因为如果您将页面更改为授权页面,则需要部署它。我需要类似于 kentico 11 中的东西,最终用户可以在不部署的情况下进行更改。感谢您的帮助。 嗯,你需要记住,在使用 MVC 时,Kentico 只是一个内容存储——所有逻辑都由你的前端 MVC 应用程序完成。但是您可以将一些自定义字段添加到将用作标志的仅内容页面类型,您将在 MVC 代码中检查此标志并应用限制。 是的,就是这样。我正在尝试了解如何为此实现身份验证和授权。【参考方案3】:我最终使用了一个带有界面的自定义表格,供用户设置页面是否需要身份验证。由于这是对 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;
【讨论】:
以上是关于Kentico 12 - 如何将单个页面设置为需要身份验证?的主要内容,如果未能解决你的问题,请参考以下文章
如何在门户设计模式下从 Kentico 中继器输出原始 JSON 页面
如何使用 kentico 为包含 Web 部件的页面内容创建索引?
如何通过 c# 代码为 Kentico 12 中的新子域生成新许可证
如果 Kentico 宏不包含 Web 部件,则隐藏小部件区域/Web 部件区域