• 喜欢和红酒的朋友注意了!!!
  • 喜欢和红酒的朋友注意了!!!
  • 喜欢和红酒的朋友注意了!!!
  • 广州市酒管家贸易有限公司是一家领先的进口葡萄酒跨境贸易公司, 为进口商提供金融、 选酒、 海运、 报关、 仓库全方位一体的供应链服务。 公司股东往返国外多 年, 为市场葡萄酒收藏家和葡萄酒爱好者从事采购、 推荐酒庄的服务。 公司熟悉市场运作,有着独特的市场运营理念, 为客户提供量身定制的营销方案、 产品定位路线并且利用专业 大数据分析采购合理性。 采购方面直采直供, 没有中间商直达酒庄源头, 帮助客户减少中间酒商, 最大化降低采购成本, 实现客户利润最大化

MVC下判断用户登录和授权状态方法

博客 James 1年前 (2020-06-29) 352次浏览 已收录 0个评论 扫描二维码

在我们日常开发的绝大多数系统中,都涉及到管理用户的登录和授权问题。登录功能(Authentication),针对于所有用户都开放;而授权(Authorization),则对于某种用户角色才开放。

在asp.net mvc中,微软虽然已经帮助开发者构建了ASP.NET Identity这样强大的验证授权框架,但是如果想定制更多的逻辑功能的话,还得自己动动手。

根据日常的开发经验,我总结了大概下面2种方法:

1、继承Controller:

1.1 在我最早的时候,比较单纯,也许是从WebForm那里学来的招式,我并没有细读Controller里的所有方法,所以在派生类里自己添加了验证方法,然后在每个Action方法里调用。此方法现在看来有些蛋疼…

派生类如下:

public class AuthenticationControllor : Controller
{
    public bool Validate()
    {
        if (Session["username"] == null)
            return false;
        else
            return true;
    }

    public ActionResult RedirectLogin(bool redirect = true)
    {
        if (redirect)
            return RedirectToAction("Login", "Home", new { from = Request.Url.ToString() });
        else
            return RedirectToAction("Login", "Home");
    }
}

使用类如下:

public class HomeController : AuthenticationControllor
{
    public ActionResult Index()
    {
        if (!Validate())
            return RedirectLogin();
 
        return View();
    }
}

1.2 后来学习了很多人的代码后,发现在Controller里有一个OnActionExecuting方法,此方法是在Action之前执行的,非常方便。

派生类如下:

public class AuthenticationControllor : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Session["username"] == null)
            filterContext.Result = new RedirectToRouteResult("Login", new RouteValueDictionary { { "from", Request.Url.ToString() } });
            
        base.OnActionExecuting(filterContext);
    }
}

使用类如下:

// 不需要多写任何逻辑代码就能判断是否登录并跳转
public class HomeController : AuthenticationControllor
{
    public ActionResult Index()
    { 
        return View();
    }
}

2. 继承ActionFilterAttribute:

由于继承Controller方法不太适合一个Controller下的有些Action需要登录有些Action不需要登录的场景,所以针对每个Action写一个统一的特性会更好一些。

ActionFilterAttribute里也有OnActionExecuting方法,跟Controller一样, 同是抽象实现了IActionFilter接口。

派生类如下:

// 登录认证特性
public class AuthenticationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Session["username"] == null)
            filterContext.Result = new RedirectToRouteResult("Login", new RouteValueDictionary { { "from", Request.Url.ToString() } });
            
        base.OnActionExecuting(filterContext);
    }
}

使用方法如下:

public class HomeController : Controller 
{ 
    [Authentication] 
    public ActionResult Index()
    {
        return View();
    }
}

如果你想针对整个MVC项目的所有Action都使用此过滤器,步骤如下:

a. 确保Global.asax.cs的Application_Start方法中包含如下红色行:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }
}

b. 在FilterConfig.cs文件中注册相应的特性过滤器:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new AuthenticationAttribute());
    }
}

 


老余博客, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:MVC下判断用户登录和授权状态方法

广州市酒管家贸易有限公司(www.jiuguanjiamaoyi.com)是一家葡萄酒进口以及葡萄酒批发零售与一体的公司。我们致力于在全国范围内用最好的价格提供最优质的葡萄酒。酒管家的使命是用高品质的葡萄酒和完善的服务来传播给大家快乐与享受。我们随时欢迎您的到来,让您体验国内最专业的葡萄酒文化! 购买联系:13672661181(微信同号)
喜欢 (1)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址