Umbraco 7.6.4自定义Public Access的IsLoggedOn功能实现问询
嘿,针对你在Umbraco 7.6.4里想自定义会员登录验证逻辑的需求,我来给你梳理几个实用的方案:
核心结论:可以自定义验证逻辑,但不建议直接修改
Members.IsLoggedIn()的原生行为,更推荐通过扩展方法或自定义授权属性来实现 方案一:自定义授权属性(适合控制器/视图级别的全局保护)
这个方案最贴合你的需求——验证不通过时自动跳转到Umbraco Public Access设置的登录页,且完全可控自定义逻辑。
首先创建一个继承自UmbracoAuthorizeAttribute的自定义属性,重写授权逻辑和未授权跳转逻辑:
public class CustomMemberAuthorizeAttribute : UmbracoAuthorizeAttribute { protected override bool AuthorizeCore(HttpContextBase httpContext) { // 替换成你的自定义验证逻辑 var currentMember = Members.GetCurrentMember(); if (currentMember == null) return false; // 示例:检查会员是否有自定义的"IsValidated"属性为true // 你可以在这里加任何逻辑:比如检查第三方token、会员有效期等 return currentMember.GetPropertyValue<bool>("IsValidated"); } protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { // 自动获取Umbraco Public Access设置的登录页URL var loginNodeId = UmbracoContext.Current.Security.GetLoginPageIdForCurrentRequest(); if (loginNodeId.HasValue) { var loginUrl = UmbracoContext.Current.ContentCache.GetById(loginNodeId.Value).Url; filterContext.Result = new RedirectResult(loginUrl); } else { // fallback到默认的未授权处理 base.HandleUnauthorizedRequest(filterContext); } } }
用法:
- 控制器级别:在需要保护的控制器或Action上标记该属性:
[CustomMemberAuthorize] public ActionResult ProtectedContent() { return View(); } - 视图级别:在视图开头直接判断,验证不通过就跳转:
@{ var authAttribute = new CustomMemberAuthorizeAttribute(); if (!authAttribute.AuthorizeCore(HttpContext.Current)) { var loginNodeId = UmbracoContext.Current.Security.GetLoginPageIdForCurrentRequest(); if (loginNodeId.HasValue) { Response.Redirect(UmbracoContext.Current.ContentCache.GetById(loginNodeId.Value).Url); } } }
方案二:扩展MembersHelper的自定义判断方法
如果你只是想在视图里替换Members.IsLoggedIn()的判断逻辑,可以给MembersHelper写一个扩展方法,这样就能像原生方法一样调用:
public static class CustomMembersExtensions { public static bool IsCustomLoggedIn(this MembersHelper membersHelper) { // 先保留原生的登录状态检查,再叠加自定义逻辑 if (!membersHelper.IsLoggedIn()) return false; var currentMember = membersHelper.GetCurrentMember(); // 这里写你的自定义验证逻辑 return currentMember.GetPropertyValue<bool>("IsValidated"); } }
用法:
在视图里直接调用:
@if (!Members.IsCustomLoggedIn()) { var loginNodeId = UmbracoContext.Current.Security.GetLoginPageIdForCurrentRequest(); if (loginNodeId.HasValue) { Response.Redirect(UmbracoContext.Current.ContentCache.GetById(loginNodeId.Value).Url); } } else { // 渲染受保护的内容 }
注意事项
- 确保你的自定义会员属性(比如示例中的
IsValidated)已经在Umbraco后台的会员类型中创建并正确赋值 - 如果你依赖Public Access的登录页配置,一定要用
UmbracoContext.Current.Security.GetLoginPageIdForCurrentRequest()来获取登录页,不要硬编码URL - 在Umbraco 7.6.4中,扩展方法需要放在
App_Code文件夹下,或者编译成类库引用到项目中
内容的提问来源于stack exchange,提问作者Sam Jones
相关产品推荐
相关产品推荐

