ASP.NET MVC下判断用户登录和授权的方法
2021腾讯云限时秒杀,爆款1核2G云服务器298元/3年!(领取2860元代金券),
地址:https://cloud.tencent.com/act/cps/redirect?redirect=1062
2021阿里云最低价产品入口+领取代金券(老用户3折起),
入口地址:https://www.aliyun.com/minisite/goods
最近我们要做一个仿sina的微博,碰巧的是我最近在学习mvc,就想用mvc技术实现这个项目。 既然是微博,那不用想也应该知道肯定要有用户登陆,但是和常规的asp.net
日常开发的绝大多数系统中,都涉及到管理用户的登录和授权问题。登录功能(Authentication),针对于所有用户都开放;而授权(Authorization),则对于某种用户角色才开放。
在asp.net mvc中,微软虽然已经帮助开发者构建了ASP.NET Identity这样强大的验证授权框架,但是如果想定制更多的逻辑功能的话,还得自己动动手。
根据日常的开发经验,我总结了下面1种方法:
1 学习了很多人的代码后,发现在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:
实现sso系统的主要难点: 1:不能直接访问数据库,有安全隐患,而且还容易乱套。 2:多个系统需要进行单点登录,逻辑需要严谨,能支持N多系统、而不只是少数几个
由于继承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()); } }


最近我们要做一个仿sina的微博,碰巧的是我最近在学习mvc,就想用mvc技术实现这个项目。 既然是微博,那不用想也应该知道肯定要有用户登陆,但是和常规的asp.net
相关阅读排行
- 1asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
- 2[Asp.Net MVC4]验证用户登录实现
- 3检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为【经典】模式)。 - CatcherX
- 4asp.net CheckBoxList 取值与勾选,复选框后台控制前台checkbox选中
- 5ASP.NET 3.5 企业级开发