【ASP.NET】ASP.NET中权限验证使用OnAuthorization实现
在项目开发中,通常我们都会涉及到用户登录才能访问的网页,比如购物网站,我们浏览商品,添加购物车(以前开发的时候在这里就需要登录用户,但是现在有了缓存的实现,这里可以将商品加入缓存,等到结账的时候再登录),选择结账的时候需要登录,那么这时候我们需要跳转到登录页面登录,登录之后还可以回到记录下来的原始的页面,那么这之后我们有好几种方法可以实现这种效果,下面笔者举例两种:
第一种:登录模块不管怎么样都是统一的,就是在每个需要登录的方法里面判断用户是否登录,如果没有登录,则跳转登录,这种的缺点是工作量大,代码冗余。
第二种:使用MVC的特性,定义类继承IAuthorizationFilter,重写OnAuthorization方法即可实现。此方法工作量少,代码不冗余,如果需要登录我们只需要给Controller或者Action给上标签即可。
上面列举了权限认证的两种形式,在实际开发中使用OnAuthorization和特性相结合的情况比较多,在任何能够使用特性的判断中都可以按照下面的思路来实现,例如(登录判断,权限判断,请求判断,去除空格,读取返回路径)等等。
接下来是笔者使用OnAuthorization的一个案例:

BaseController.cs
namespace MvcApplication1.Controllers
{
public class BaseController : Controller
{
protected override void OnAuthorization(AuthorizationContext context)
{
//解析控制器的名称
string ControllerName = context.ActionDescriptor.ControllerDescriptor.ControllerName;
if (ControllerName.ToLower() == "Manager".ToLower())//这里只对Manager的控制器进行权限验证
{
var b = context.HttpContext.Request.Browser;//浏览器判断 ie8 居然是7.0
if (b.Browser == "IE" && float.Parse(b.Version) < )
{
context.Result = Content("ie浏览器就只支持ie8+", "text/json");
return;
}
//解析出对应的方法
var Method = context.Controller.GetType().GetMethods().Where(c => c.Name.ToLower() == context.ActionDescriptor.ActionName.ToLower()).FirstOrDefault();
if (Method == null)
{
context.Result = Content("权限不够", "text/json");
return;
}
//解析出方法上面对应的特性
AccessAttribute acc = Method.GetCustomAttributes(typeof(AccessAttribute), true).FirstOrDefault() as AccessAttribute;
if (acc != null)
{
if (acc.IsAccess == AccessEnum.Login)//需要登录权限
{
if (!IsLogin())
{
context.HttpContext.Response.Redirect("~/Manager/Login");//如果没有登录,就跳转到登录页面
return;
}
}
else if (acc.IsAccess == AccessEnum.Access)//需要其他权限
{
if (!IsAccess(context))
{
context.Result = Content("权限不够", "text/json");
return;
}
}
}
}
base.OnAuthorization(context);
}
/// <summary>
/// 检查是否登录
/// </summary>
/// <returns>一个bool类型的数据,表示用户是否登录</returns>
public bool IsLogin()
{
String userName = (String)System.Web.HttpContext.Current.Session["UserName"];
String Password = (String)System.Web.HttpContext.Current.Session["Password"];
if (System.Web.HttpContext.Current.Session["UserName"] != null)
{
if ("abc".Equals(userName) && "".Equals(Password)) {
return true;
}
}
else
{
if (System.Web.HttpContext.Current.Request.Cookies["settings"] == null) {
return false;
}
//检查Cookies
String cookie_UserName = System.Web.HttpContext.Current.Request.Cookies["settings"]["UserName"];
String cookie_Password = System.Web.HttpContext.Current.Request.Cookies["settings"]["Password"];
//检查用户名和密码
if (cookie_UserName == null || cookie_Password == null)
{
return false;
}
else {
//在数据库中检查
if ("abc".Equals(cookie_UserName) && "".Equals(cookie_Password)) {
//把用户名和密码放到Session中
Session.Add("UserName", cookie_UserName);
Session.Add("Password", cookie_Password);
return true;
}
}
}
return false;
}
/// <summary>
/// 权限检查
/// </summary>
/// <param name="context"></param>
/// <returns>一个bool的数据,表示用户是否拥有其他权限</returns>
public bool IsAccess(AuthorizationContext context)
{
bool isAccess = false; var controller = context.RouteData.Values.Keys.First(p => p == "controller");
var action = context.RouteData.Values.Keys.First(p => p == "action");
var url = "/" + context.RouteData.Values[controller] + "/" + context.RouteData.Values[action]; //根据controller和action 可以判断权限了
//isAccess = true; return isAccess;
}
}
}
BaseController.cs
这里的BaseController类继承了Controller,并且重写了其中了OnAuthorization方法,在OnAuthorization方法中,首先解析出用户请求的Controller名称,然后判断是否需要验证这个Controller,案例中验证的是名为Manager的Controller,得到了对应的Controller后,接下来解析用户请求的具体是什么方法,再利用反射找出方法有什么特性,根据特性进行权限验证。
ManagerController.cs
namespace MvcApplication1.Controllers
{
public class ManagerController : BaseController
{ [Access(IsAccess = AccessEnum.Login)]
public ActionResult Index()
{
return View("index");
} [Access(IsAccess = AccessEnum.Anonymous)]
public ActionResult ToLogin(){
String user = Request["UserName"];
String password = Request["Password"];
if ("abc".Equals(user) && "".Equals(password)) {
//放到session中
Session.Add("UserName", "abc");
Session.Add("Password", "");
//放到Cookie中,可以进行加密处理
HttpCookie myCookie = new HttpCookie("settings");
myCookie["UserName"] = user;
myCookie["Password"] = password;
System.Web.HttpContext.Current.Response.Cookies.Add(myCookie);
HttpContext.Response.Redirect("~/Manager/Index");
}
return View("Error");
} [Access(IsAccess = AccessEnum.Anonymous)]
public ActionResult Login()
{
return View();
}
[Access(IsAccess = AccessEnum.Login)]
public ActionResult LoginOff(){
//清除Session信息
Session.Clear();
//清除Cookie信息
HttpCookie myCookie = new HttpCookie("settings");
myCookie.Expires = DateTime.Now;
System.Web.HttpContext.Current.Response.Cookies.Add(myCookie);
HttpContext.Response.Redirect("~/Manager/index");
}
}
}
ManagerController.cs
AccessAttribute.cs
namespace MvcApplication1.Models.Attribute
{
/// <summary>
/// <para>创建自定义权限认证特性</para>
/// <para>该特性应用的范围可以为类、构造方法、字段、方法、属性</para>
/// </summary>
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
public class AccessAttribute : System.Attribute
{
public AccessEnum IsAccess { set; get; }
} /// <summary>
/// 权限认证级别
/// </summary>
public enum AccessEnum
{
/// <summary>
/// 权限认证
/// </summary>
Access,
/// <summary>
/// 只需要登录
/// </summary>
Login,
/// <summary>
/// 不需要登录
/// </summary>
Anonymous
}
}
AccessAttribute.cs
Error.cshtml
@{
ViewBag.Title = "error";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>账号密码错误</h2>
Error.cshtml
Index.cshtml
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>登录成功,恭喜你登录成功</h2>
Index.cshtml
Login.cshtml
@{
ViewBag.Title = "登录";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div>
<form action="tologin" method="post">
<input type="text" name="UserName"/><br />
<input type="password" name="Password" /><br/>
<input type="submit" value="提交" />
</form>
</div>
Login.cshtml
【ASP.NET】ASP.NET中权限验证使用OnAuthorization实现的更多相关文章
- ASP.Net MVC3/4中Model验证错误信息的本地化
最近使用ASP.Net MVC4做一个B/S的管理系统,里面有N多的Action和View Model,View Model上又有N多的验证. 一开始写的时候虽然知道要实现多语言,但是没有过多考虑,本 ...
- ASP.NET Core 下自定义权限验证
效果图: 如果没有权限时,显示: 代码: public class AuthorizeAdminAttribute : TypeFilterAttribute { #region 字段 private ...
- ASP.NET MVC过滤器中权限过滤器ValidateAntiForgeryToken的用法(Post-Only)
源参考:https://i.cnblogs.com/EditPosts.aspx?opt=1 用途:防止CSRF(跨网站请求伪造). 用法:在View->Form表单中:<%:Html.A ...
- ASP.NET没有魔法——ASP.NET Identity 的“多重”身份验证
ASP.NET Identity除了提供基于Cookie的身份验证外,还提供了一些高级功能,如多次输入错误账户信息后会锁定用户禁止登录.集成第三方验证.账户的二次验证等,并且ASP.NET MVC的默 ...
- 2_MVC+EF+Autofac(dbfirst)轻型项目框架_用户权限验证
前言 接上面两篇 0_MVC+EF+Autofac(dbfirst)轻型项目框架_基本框架 与 1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例) .在第一篇中介 ...
- ABP(现代ASP.NET样板开发框架)系列之18、ABP应用层——权限验证
点这里进入ABP系列文章总目录 ABP(现代ASP.NET样板开发框架)系列之18.ABP应用层——权限验证 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目 ...
- ASP.NET MVC View 和 Web API 的基本权限验证
ASP.NET MVC 5.0已经发布一段时间了,适应了一段时间,准备把原来的MVC项目重构了一遍,先把基本权限验证这块记录一下. 环境:Windows 7 Professional SP1 + Mi ...
- Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码
本问主要介绍asp.net的身份验证机制及asp.net MVC拦截器在项目中的运用.现在让我们来模拟一个简单的流程:用户登录>权限验证>异常处理 1.用户登录 验证用户是否登录成功步骤直 ...
- ASP.NET MVC:窗体身份验证及角色权限管理示例
ASP.NET MVC 建立 ASP.NET 基础之上,很多 ASP.NET 的特性(如窗体身份验证.成员资格)在 MVC 中可以直接使用.本文旨在提供可参考的代码,不会涉及这方面太多理论的知识. 本 ...
随机推荐
- 例子:使用Grunt创建一个Node.js类库
创建一个文件夹. 打开命令行或者powershell, 运行npm init,根据提示填入package的信息. 在文件夹中创建index.js文件. /*! * mymongolib * Cop ...
- 定制加载loading 图片
项目中要使用一个动态加载图片,找了好久都没有合适的最后发现了这个网站,自由定制需要的gif图片,完全免费啊 http://preloaders.net/en/
- [Tool] Enable Prettier in VSCode as Format on Save and add config files to gitingore
First of all, install Prettier extension: "Pettier - Code formatter". The open the VSCode ...
- UltraISO制作U盘启动盘安装Win7/9/10系统攻略
U盘安装好处就是不用使用笨拙的光盘,光盘还容易出现问题,无法读取的问题.U盘体积小,携带方便,随时都可以制作系统启动盘. U盘建议选择8G及以上大小的. 下面一步一步讲解如果制作U盘安装盘: 1.首先 ...
- ecshop中smarty最常用的6大基本语法
模板制作比较核心的其实就是变量的使用,因为这些就是数据的根本,想从数据库里获取数据并显示在界面就必须使用smarty来展示,下面是关于smarty的介绍和使用.Smarty是一个php模板引擎,它分开 ...
- WDCP,LNMP安装PHP缓存加速扩展eAccelerator,xcache和memcached
VPS主机性能配置如果太差,则在运行Wordpress博客和Discuz! 论坛等高消耗程序时能够明显感觉出VPS有些吃力.另外,即使VPS主机的CPU.内存.硬盘I/O等性能足够好,但是在面对大流量 ...
- SVN 配置文件说明
svnserve是SVN自带的一个轻型服务器,客户端通过使用以svn://或svn+ssh://为前缀的URL来访问svnserve服务器,实现远程访问SVN版本库.svnserve可以通过配置文件来 ...
- C#中RSA加密解密和签名与验证的实现
RSA加密算法是一种非对称加密算法.在公钥加密标准和电子商业中RSA被广泛使用.RSA是1977年由罗纳德•李维斯特(Ron Rivest).阿迪•萨莫尔(Adi Shamir)和伦纳德•阿德曼(Le ...
- Selenium2(WebDriver)总结(二)---Firefox的firebug插件参数设置(补充)
本文是对上一节的补充:http://www.cnblogs.com/puresoul/p/4251536.html 使用Selenium2(webdriver)启动firefox且自动加载firebu ...
- 微信小程序 - 接口更新记录以及解决方案(2018/12/26)
2018/8/17 - 背景音频需要在app.json添加requireBackGroundModes 2018/9/12 - 微信更改获取用户信息接口/获取位置等接口 - button 2018/1 ...