asp.net mvc 权限过滤和单点登录(禁止重复登录)
1.权限控制使用controller和 action来实现,权限方式有很多种,最近开发项目使用控制控制器方式实现代码如下
/// <summary>
/// 用户权限控制
/// </summary>
public class UserAuthorize : AuthorizeAttribute
{ /// <summary>
/// 授权失败时呈现的视图
/// </summary>
public string AuthorizationFailView { get; set; } /// <summary>
/// 请求授权时执行
/// </summary>
/// <param name="filterContext">上下文</param>
public override void OnAuthorization(AuthorizationContext filterContext)
{ // 获取url请求里的 controller 和 action
string controllerName = filterContext.RouteData.Values["controller"].ToString();
string actionName = filterContext.RouteData.Values["action"].ToString(); // 获取用户信息
UserLoginBaseInfo _userLoginInfo = filterContext.HttpContext.Session[Property.UerLoginSession] as UserLoginBaseInfo; //根据请求过来的controller和action去查询可以被哪些角色操作: 这是查询数据库 roleid使用 1,2,3,4格式
RoleWithControllerAction roleWithControllerAction =
SampleData.roleWithControllerAndAction.FirstOrDefault(r => r.ControllerName.ToLower() == controllerName.ToLower() && r.ActionName.ToLower() == actionName.ToLower() && r.RoleIds.contails("3")); // 有值处理
if (roleWithControllerAction != null)
{
//有权限操作当前控制器和Action的角色id
this.Roles = roleWithControllerAction.RoleIds;
}
else
{
//请求失败输出空结果
filterContext.Result = new EmptyResult();
//打出提示文字
HttpContext.Current.Response.Write("对不起,你没有权限操作!");
} base.OnAuthorization(filterContext);
} /// <summary>
/// 自定义授权检查(返回False则授权失败)
/// </summary>
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
//if (httpContext.User.Identity.IsAuthenticated)
//{
// string userName = httpContext.User.Identity.Name; //当前登录用户的用户名
// User user = SampleData.users.Find(u => u.UserName == userName); //当前登录用户对象 // if (user != null)
// {
// Role role = SampleData.roles.Find(r => r.Id == user.RoleId); //当前登录用户的角色
// foreach (string roleid in Roles.Split(','))
// {
// if (role.Id.ToString() == roleid)
// return true;
// }
// return false;
// }
// else
// return false;
//}
//else
// return false; //进入HandleUnauthorizedRequest return true;
} /// <summary>
/// 处理授权失败的HTTP请求
/// </summary>
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (string.IsNullOrWhiteSpace(AuthorizationFailView))
AuthorizationFailView = "error"; filterContext.Result = new ViewResult { ViewName = AuthorizationFailView };
}
}
二.单点登录方式使用application方式来实现
1.用户登录成功后记录当前信息
/// <summary>
/// 限制一个用户只能登陆一次
/// </summary>
/// <returns></returns>
private void GetOnline()
{
string UserID = "1";
Hashtable SingleOnline = (Hashtable)System.Web.HttpContext.Current.Application[Property.Online];
if (SingleOnline == null)
SingleOnline = new Hashtable(); IDictionaryEnumerator idE = SingleOnline.GetEnumerator();
string strKey = string.Empty;
while (idE.MoveNext())
{
if (idE.Value != null && idE.Value.ToString().Equals(UserID))
{
//already login
strKey = idE.Key.ToString(); //当前用户已存在移除、
SingleOnline.Remove(strKey);
System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application[Property.Online] = SingleOnline;
System.Web.HttpContext.Current.Application.UnLock();
break;
}
} //SessionID
if (!SingleOnline.ContainsKey(Session.SessionID))
{
SingleOnline[Session.SessionID] = UserID;
System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application[Property.Online] = SingleOnline;
System.Web.HttpContext.Current.Application.UnLock();
}
}
2.使用ActionFilter来实现单点登录,每次点击控制器都去查询过滤是否在其它地方登录
/// <summary>
/// 用户基础信息过滤器
/// </summary>
public class LoginActionFilter : ActionFilterAttribute
{ /// <summary>
/// 初始化地址
/// </summary>
public const string Url = "~/Login/Index?error="; /// <summary>
/// 该方法会在action方法执行之前调用
/// </summary>
/// <param name="filterContext">上下文</param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// 获取上一级url
// var url1 = filterContext.HttpContext.Request.UrlReferrer; UserLoginBaseInfo _userLogin = filterContext.HttpContext.Session[Property.UerLoginSession] as UserLoginBaseInfo;
// 用户是否登陆
if (_userLogin == null)
{
filterContext.Result = new RedirectResult(Url + "登陆时间过期,请重新登陆!&url=" + filterContext.HttpContext.Request.RawUrl);
}
else
{
filterContext.HttpContext.Session.Timeout = 30;
} //判断是否在其它地方登录
Hashtable singleOnline = (Hashtable)System.Web.HttpContext.Current.Application[Property.Online]; // 判断当前SessionID是否存在
if (singleOnline != null && !singleOnline.ContainsKey(HttpContext.Current.Session.SessionID))
filterContext.Result = new RedirectResult(Url + "你的帐号已在别处登陆,你被强迫下线!"); base.OnActionExecuting(filterContext); } /// <summary>
/// 执行后
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuting(ResultExecutingContext filterContext)
{ //记录操作日志,写进操作日志中
var controllerName = filterContext.RouteData.Values["controller"];
var actionName = filterContext.RouteData.Values["action"];
base.OnResultExecuting(filterContext);
}
3.用户正常退出或则非正常退出处理当前用户信息销毁Session
/// <summary>
/// Session销毁
/// </summary>
protected void Session_End()
{
Hashtable SingleOnline = (Hashtable)Application[Property.Online];
if (SingleOnline != null && SingleOnline[Session.SessionID] != null)
{
SingleOnline.Remove(Session.SessionID);
Application.Lock();
Application[Property.Online] = SingleOnline;
Application.UnLock();
}
Session.Abandon();
}
转载说明原文地址:https://i.cnblogs.com/EditPosts.aspx?opt=1
asp.net mvc 权限过滤和单点登录(禁止重复登录)的更多相关文章
- 开篇ASP.NET MVC 权限管理系列
开篇 [快乐编程系列之ASP.NET MVC 权限管理系列]一.开篇 用了好长一段时间的ASP.NET MVC,感觉MVC真的是很好用,最近一年左右做了两个中小型项目,觉得还是很多地方不是很熟悉的 ...
- Easyui + asp.net MVC 系列教程 第19-23 节 完成注销 登录限制过滤 添加用户
前面视频 文章地址 Easyui + asp.net MVC 系列教程 第09-17 节 完成登录 高清录制 Easyui + asp.net mvc + sqlite 开发教程(录屏)适合入门 ...
- Asp.net MVC 权限过滤器实现方法的最佳实践
在项目开发中,为了安全.方便地判断用户是否有访问当前资源(Action)的权限,我们一般通过全局过滤器来实现. Asp.net MVC 页面中常见的权限判断使用过滤器主要在以下几种情况(根据权限判断的 ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC资源过滤和授权
最近比较忙,博客很久没更新了,很多博友问何时更新博文,因此,今天就花了点时间,写了本篇文章,但愿大家喜欢. 本篇文章不适合初学者,需要对ASP.NET MVC具有一定基础. 本篇文章主要从ASP.NE ...
- php实现单个用户禁止重复登录,防止同一用户同时登陆
<?php session_start(); //ini_set('session.auto_start', 0); //关闭session自动启动 //ini_set('session.coo ...
- ASP.NET MVC权限控制思路
在系统开发的时候一个老生常谈的权限管理问题,翻阅了很多的网络资料,但是总感觉离实际使用还有一段距离,其实权限控制无非就几个“请求.页面按钮.字段显示”, 对于前端权限就需要配合JS了, 这里主要展示我 ...
- asp.netcore mvc 权限拦截
1-背景介绍 需要做一个简单权限系统,基于 角色,用户,菜单 的模式 基于IActionFilter全局拦截,在内部跳转或者浏览器跳转的时候,拦截是成功的,当通过AJAX 请求的时候,页面就不会跳转 ...
- ASP.NET MVC Filter过滤机制(过滤器、拦截器)
https://blog.csdn.net/knqiufan/article/details/82413885 本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/ ...
- ASP.NET MVC权限验证 封装类
写该权限类主要目地 为了让权限配置更加的灵活,可以根据SQL.json.或者XML的方式来动态进行页面的访问控制,以及没有权限的相关跳转. 使用步骤 1.要建一个全局过滤器 //受权过滤器 publi ...
随机推荐
- querystring模块
querystring处理参数的小利器. 下面是querystring的四个方法. ①stringify:将一个参数对象序列化为一个字符串 eg: querystring.stringify({n ...
- 深入Collection集合
List集合 一.ArraryList: 最基本的集合不多做介绍 二.Vector Vector cn=new Vector(); A:有特有功能 a:添加 public void ad ...
- 细谈Slick(6)- Projection:ProvenShape,强类型的Query结果类型
在Slick官方文档中描述:连接后台数据库后,需要通过定义Projection,即def * 来进行具体库表列column的选择和排序.通过Projection我们可以选择库表中部分列.也可以增加一些 ...
- Tomcat数据源(DataSource)简介
JDBC2.0提供了javax.sql.DataSource接口,它负责建立与数据库的连接,在应用程序中访问数据库时不必编写连接数据库的代码,可以直接从数据源获得数据库连接 1.数据库和连接池 在Da ...
- bootstrap的栅格布局与两列布局结合使用
在工作中我们常常需要实现响应式布局,这个可以使用bootstrap的栅格系统来实现,我们在列里也需要实现一部分的响应式.比如下面的效果图,需要实现左边图标固定,右边的自适应 : 左边固定宽度,右边自适 ...
- maven常用插件集
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- 在SharePoint 2013 之中使用JS从Add-in程序中读取用户配置文件的属性
经过无数次的实验,只有这个程序可以运行正常 ,代码贴出来纯的JSOM,在我的实验环境老是返回未知错误,为了这一个简单的任务,我已经搞了2天了,不过终于搞出来了,使用各种方法后,还有使用代码. func ...
- Android中使用GridView和ImageViewSwitcher实现电子相册简单功能
我们在手机上查看相册时,首先看到的是网格状的图片展示界面,然后我们选择想要欣赏的照片点击进入,这样就可以全屏观看该照片,并且可以通过左右滑动来切换照片.如下图的显示效果: 首先我们先罗列一下本次实现所 ...
- 转:IE兼容模式下 SCRIPT1028: 缺少标识符、字符串或数字
IE兼容模式下 SCRIPT1028: 缺少标识符.字符串或数字例如下面一段代码 var a = { x: 1, y: 2,};alert(a.x);如果在IE的兼容性视图(IE7文档模式 ...
- JAVA编程思想(第四版)学习笔记----4.8 switch(知识点已更新)
switch语句和if-else语句不同,switch语句可以有多个可能的执行路径.在第四版java编程思想介绍switch语句的语法格式时写到: switch (integral-selector) ...