ASP.NET权限管理
ASP.NET Web Forms权限管理:
我要将一个文件夹只能让一个用户组访问怎么办?
可否在网站根目录下的web.config里这样设置:
<location path="admin">
<system.web>
<authorization>
<allow roles="adminer">
</allow>
<deny users="*">
</deny>
</authorization>
</system.web>
</location>
(注:最后经过测试,这样是可以的,这里只是为了说明web.config是分层,可覆盖的)
最后我想到,在每个文件夹下加一个web.config重写
<authorization/>部分
如:
a文件夹下web.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<authorization>
<allow roles = "admin"/>
<deny user = "?"/>
</authorization>
</system.web>
</configuration>
b文件夹下的web.congfig
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<authorization>
<allow roles="teacher"/>
<deny users = "?" roles = "student,admin"/>
</authorization>
</system.web>
</configuration>
这样就对不同的文件夹实现不同的授权了
基于角色的验证终于完成了
如下实现方法:
1.在web.config里这样设置:
<system.web>
<authorization>
<allow = “roleslist”/>
<deny users = “?”/>
</authorization>
</system.webconfig>
登陆成功以后生成一个票据,票据里存储有用户的用户名和角色等信息,将票据发送到客户端,并跳转到请求的页面。
如:
//如果通过验证
if (IsPass)
{
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(,studentinfo.userid,DateTime.Now,DateTime.Now.AddMinutes(),false,studentinfo.role,"/");
string CodeTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,CodeTicket);
Context.Response.Cookies.Add(cookie);
Context.Response.Redirect(RedirectTarget);
}
2.在Gloabal.asa.cs里的Application_AuthenticateRequest中获取客户端的cookie中的role信息,并生成GenericPrincipal对象保存在Application.Conext.User里
如:
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
HttpApplication App = (HttpApplication) sender;
HttpContext Ctx = App.Context ; //获取本次Http请求相关的HttpContext对象
if (Ctx.Request.IsAuthenticated == true) //验证过的用户才进行role的处理
{
FormsIdentity Id = (FormsIdentity)Ctx.User.Identity ;
FormsAuthenticationTicket Ticket = Id.Ticket ; //取得身份验证票
string[] Roles = Ticket.UserData.Split (',') ; //将身份验证票中的role数据//转成字符串数组
Ctx.User = new GenericPrincipal (Id, Roles) ; //将原有的Identity加上角色信//息新建一个GenericPrincipal表示当前用户,这样当前用户就拥有了role信息
}
}
使用这种权限管理的前提是Web Forms进行开发,在MVC框架中,这种方法却无法正常工作,原因有两点:
- 请求不再映射到物理目录。
- 可能存在多种查找同一控制器的方式。
ASP.NET MVC权限管理:
Authorize特性是ASP.NET MVC自带的默认授权过滤器,可用来限制用户对操作方法的访问。
对于大多数网站来说,基本上整个应用程序都是需要授权的。因此,把AuthorizeAttribute配置为全局过滤器,使用AllowAnonymous特性匿名访问指定控制器或方法,就变成了不错的想法。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new System.Web.Mvc.AuthorizeAttribute());
filters.Add(new HandleErrorAttribute());
}
这样就会把AuthorizeAttribute应用到整个程序的所有控制器操作。显而易见,这样也限制了对整个网站的访问。MVC4中新添加了AllowAnonymous特性,用AllowAnonymous特性装饰的方法能够匿名访问。
我们也能限制特定用户或角色的访问,Authorize特性允许指定角色和用户:
[Authorize(Roles = "Administrator,SuperAdmin", Users = "Jon,Phil")]
public class TopSecretController : Controller
值得注意的是全局过滤器只针对MVC控制器操作,不能保障Web Forms、静态内容或其他ASP.NET处理程序的安全。
除了使用过滤器控制权限,我们可以在运行Controller之前来判断用户操作权限,那么我们可以试想此处的应用场景,如当我们的用户未认证,那么我们可以通过直接判断跳转到认证页面。
具体实现方法:重写Controller里面的OnActionExecuting,需要授权认证的控制器继承重写后的Controller。
/// <summary>
/// 在执行操作方法之前由 MVC 框架调用,我们在此实现我们的权限验证
/// </summary>
/// <param name="filterContext"></param>
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
int statusCode = ;//200:成功,401:未登录,403:没有权限
string url = Request.RawUrl.ToLower();
if (Method.isLogin())
{
if (!checkAuthority(url))
{
statusCode = ;
}
}
else
{
statusCode = ;
}
if (statusCode != )//未通过授权
{
if (url.Contains("/api"))//api异步请求返回状态码
{
var json = new
{
result = statusCode
};
filterContext.Result = Json(json, JsonRequestBehavior.AllowGet);
}
else//页面请求跳转
{
//filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = "Login", action = "Login" }));
switch (statusCode)
{
case :
filterContext.Result = RedirectToAction("Login", "Login");
break;
case :
filterContext.Result = RedirectToAction("NoAuthority", "Login");
break;
}
}
}
}
其中的checkAuthority()方法判断管理员的权限:
/// <summary>
/// 权限判断
/// </summary>
/// <param name="power"></param>
private bool checkAuthority(string url)
{
string[] arr = Method.getAdminInfo["authority"].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
string val = "";
switch (url)
{
//权限100 查看会员
case "/member/mymember":
val = ""; break;
//权限101 修改会员
case "/api/editmember":
val = ""; break;
}
if (val != "")//该页面需要权限进入
{
return arr.Contains(val);
}
else
{
return true;
}
}
其中的Method.getAdminInfo["authority"]是我写的获取登录票据中管理员的权限(用“,”分割的数字)。
RBAC数据库设计图:

原文参考:.net用户角色与访问权限控制
《ASP.NET MVC4 高级编程》(第四版)
ASP.NET权限管理的更多相关文章
- ASP.NET 开发必备知识点(2):那些年追过的ASP.NET权限管理
一.前言 在前一篇文章已经为大家介绍了OWIN和Katana,有了对他们的了解之后,才能更好地去学习Asp.net Identity,因为Asp.net Identity的实现集成了Owin.其实在A ...
- ASP.NET-权限管理五张表
ASP.NET 权限管理五张表 权限管理的表(5张表) 每个表里面必有的一些信息 序号 名称 字段 类型 主键 默认值 是否为空 备注 1 用户ID ID INT 是 ...
- Asp.Net Mvc通用后台管理系统,bootstrap+easyui+权限管理+ORM
产品清单: 1.整站源码,非编译版,方便进行业务的二次开发 2.通用模块与用户等基础数据的数据库脚本 3.bootstrap3.3.1 AceAdmin模板源码 4.easyui1.3.5源码 5.F ...
- Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理
这是本人第一次写,写的不好的地方还忘包含.写这个的主要原因是想通过这个来学习下EF的CodeFirst模式,本来也想用AngularJs来玩玩的,但是自己只会普通的绑定,对指令这些不是很熟悉,所以就基 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(24)-权限组的设计和实现(附源码)(终结)
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列
http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开 ...
- 仿SiteMap实现Asp.net 网站的菜单和权限管理
在Asp.net中,SiteMap用于站点导航,可以与Menu等控件一起使用实现网站的菜单和权限管理.但是SiteMap提供的方法都是只读的,无法再运行时修改(菜单)导航文件,需要手动修改配置web. ...
- ASP.NET MVC:窗体身份验证及角色权限管理示例
ASP.NET MVC 建立 ASP.NET 基础之上,很多 ASP.NET 的特性(如窗体身份验证.成员资格)在 MVC 中可以直接使用.本文旨在提供可参考的代码,不会涉及这方面太多理论的知识. 本 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框 ...
随机推荐
- Python 批量修改文件名
最近下载了几部美剧(越狱.迷失.权利的游戏......),每集文件名都好长好长..想改短一些,但一个一个改太累了,于是写了个脚本来实现批量修改: 修改前文件名: 修改后文件名: 代码实现: #enco ...
- 关于回溯与n个数的全排列
今天要讲的题目是全排列的问题:有1.2.3.....n这样一个数列,要求输出其全排列. 那么,显然,这道题目非常之简单,用一个标志数组变量,标记数字的使用情况,然后根据它挑选数字即可.由于题目很简单, ...
- 取得系统属性和Java环境
代码如下: import java.util.Enumeration; import java.util.Iterator; import java.util.Map; import java.uti ...
- 集群 & 负载均衡
集群(Cluster) 指一组计算机系统构成一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信,实现分布式计算.在客户端看来就像是只有一个服务器.集群可以利用多个计算机进行并行计算从而获得很高 ...
- Web 应用程序中的安全向量 – ASP.NET MVC 4 系列
Web 程序运行在标准的.基于文本的协议(HTTP 和 HTML)之上,所以特别容易受到自动攻击的伤害.本章主要介绍黑客如何滥用应用程序,以及针对这些问题的应对措施. 威胁:跨站脚本 ...
- .net framework 3.5 序列化
1.JSON序列化. 首先,引用程序集 System.Runtime.Serialization, 我们要使用System.Runtime.Serialization.Json,默认点不出来,这应该是 ...
- k8s DNS 服务发现的一个坑
按照官当文档,以及大家的实践进行k8s dns 服务发现搭建还是比较简单的,但是会有一个因为系统默认dns 配置造成的一个问题 1. linux 默认dns 配置在 /etc/resolv.conf ...
- 压力测试报出503错误---ASP.NET支持大并发的相关配置
项目反馈报出503错误,需要收集性能数据如下: 1.Windows性能监视器,该应用程序池进程的线程和处理队列 2.问题重现时的进程dump 这是请求到达IIS后遇到的第一个队列,HTTP.sys收到 ...
- 一条SQL查询多个统计结果
例如以下情况,假如字段3是日期类型,按照小时分组统计字段1为空的个数,并对字段2大于5的值求和: SELECT SUM(CASE WHEN field1 IS NULL THEN 1 ELSE 0 E ...
- git diff提示filemode发生改变(old mode 100644、new mode 10075)
今天clone代码,git status显示修改了大量文件,git diff提示filemode变化,如下: diff --git a/Android.mk b/Android.mkold mode ...