我想知道Kentico是否采用“最佳实践”方式确保需要SSL 属性在特定页面类型上设置为是,而不继承父页面中的属性。
我已经对此进行了研究,并实施了一个可行的解决方案(下方),但我很想知道是否有一个更好的“开箱即用”解决方案,我可能忽略了。
我们正在使用Kentico v8.2和ASPX + Portal页面类型。
我们的技术要求
我们的用例场景
用户浏览列出职位空缺的页面。用户打开一个特定的职位空缺页面,其中包含申请表。当用户通过安全连接提供页面时,用户有信心在申请表中输入个人详细信息。
考虑解决方案
我能找到的最接近“开箱即用”的解决方案是将父列表页面设置为需要SSL =是,然后在子页面上继承此项,但这不符合我们的要求允许通过HTTP提供列表页面的技术要求。
我还决定不在每个子页面上手动设置 Requires SSL = Yes ,因为我不想将这个负担放在CMS编辑器上,给予他们超过必要的权限并打开它人为错误。
当前解决方案
所以我最终编写了一个自定义事件处理程序来设置文档插入或文档更新事件的Requires SSL属性。
最初我是基于页面类型(Node.ClassName)执行此操作,但是将其更改为基于Field值,以便我可以通过简单地添加字段而不重构我的代码和部署来更轻松地将其应用于其他页面类型一个DLL。
[CustomEvents]
public partial class CMSModuleLoader
{
private class CustomEvents : CMSLoaderAttribute
{
public override void Init() {
DocumentEvents.Insert.Before += Document_Insert_Before;
DocumentEvents.Update.Before += Document_Update_Before;
}
void Document_Insert_Before(object sender, DocumentEventArgs e)
{
SetRequiresSSL(e.Node);
}
void Document_Update_Before(object sender, DocumentEventArgs e)
{
SetRequiresSSL(e.Node);
}
private void SetRequiresSSL(TreeNode node)
{
//if RequiresSecureConnection field is equal to true
if (node.GetBooleanValue("RequiresSecureConnection", false))
{
//if Requires SSL is not Yes
if (node.RequiresSSL != 1)
{
//set Requires SSL
node.RequiresSSL = 1;
}
}
}
}
}
相关网址