You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
{
    // 渲染受保护的内容
}

注意事项

  1. 确保你的自定义会员属性(比如示例中的IsValidated)已经在Umbraco后台的会员类型中创建并正确赋值
  2. 如果你依赖Public Access的登录页配置,一定要用UmbracoContext.Current.Security.GetLoginPageIdForCurrentRequest()来获取登录页,不要硬编码URL
  3. 在Umbraco 7.6.4中,扩展方法需要放在App_Code文件夹下,或者编译成类库引用到项目中

内容的提问来源于stack exchange,提问作者Sam Jones

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:20:36