当前位置: 首页 > news >正文

Asp.Net 中使用HttpModule 做Session验证

session的检查可以考虑用一个http module挂在http pipeline上


过程如下:


1. 在Web.Config 配置:


 <httpModules>
      <!--Edas Authentication-->
      <add name="eDASAuthenticationModule" type="CRMWeb.eDAS.HttpModules.eDASAuthenticationModule"/>
      
    </httpModules>



2.添加httpmodule

代码:
把验证挂在了 PreRequestHandlerExecute 上 ,因为在这一步,session才被创建。



using System.Linq;
using System.Reflection;
using System.Web;
using CRMWeb.eDAS.Util;
using CRMWeb.eDAS.Entities;

namespace CRMWeb.eDAS.HttpModules
{
    public class eDASAuthenticationModule : IHttpModule
    {
        #region IHttpModule Members

        public void Dispose()
        {
            //clean-up code here.
        }

        public void Init(HttpApplication context)
        {
            context.PreRequestHandlerExecute += (sender, args) =>
                {
                    var c = sender as HttpApplication;
                    CheckLoginState(c);
                };
        }

        private void CheckLoginState(HttpApplication context)
        {
            if (context.Request.RawUrl.LastIndexOf('/') < 0)
                return;

            var requestPageName = GetPageNameFromUrl(context.Request.RawUrl);

            ALWAYS allow Access Branch Login Page
            if (eDASConstants.NavigatePage.BranchLoginUrl.Contains(requestPageName))
                return;

            var fields = typeof(eDASConstants.NavigatePage).GetFields
                (BindingFlags.Public | BindingFlags.Static);

            var allPages = fields.Select((t, i) => t.GetValue(t).ToString()).ToList();

            //1.indicate NOT Request branch login , check ticket
            if (EdasContext.TicketInfoSession.Current == null &&
                allPages.Any(p => p.Contains(requestPageName)))
            {
                EdasContext.ClearAll();
                context.Response.Redirect(eDASConstants.NavigatePage.BranchLoginUrl);
            }

            //2.indicate have ticket , if want to go sales person page , let him go

            if (eDASConstants.NavigatePage.SalesPersonLoginUrl.Contains(requestPageName))
                return;
            //if do not want to go sales person login , check sales person session
            if (EdasContext.SalesPersonSession.Current == null &&
                allPages.Any(p => p.Contains(requestPageName)))
            {
                EdasContext.ClearCurrentCustomerSession();
                context.Response.Redirect(eDASConstants.NavigatePage.SalesPersonLoginUrl);
            }

            //indicate sales person login session & ticket both have value
            //if want to go customer queue , let him go
            if (eDASConstants.NavigatePage.CustomerQueueInfoUrl.Contains(requestPageName))
                return;

            //3.sales person & ticket NOT null,if still want to go anywhere NOT queue page,check session if not go back
            if (EdasContext.CustomerQueueSession.Current == null &&
                !eDASConstants.NavigatePage.CustomerQueueInfoUrl.Contains(requestPageName) &&
                allPages.Any(p => p.Contains(requestPageName)))
            {
                EdasContext.ClearCurrentCustomerSession();
                context.Response.Redirect(eDASConstants.NavigatePage.CustomerQueueInfoUrl);
            }
        }

        private string GetPageNameFromUrl(string url)
        {
            var indexOfSlash = url.LastIndexOf('/');
            var nameWithQuery = url.Substring(indexOfSlash, url.Length - indexOfSlash);
            var indexOfParam = url.IndexOf('?');
            return url.Contains("?") ? url.Substring(0, indexOfParam) : nameWithQuery;
        }
        #endregion

    }
}



相关文章:

  • Asp.Net MVC4系列---基础篇(4)
  • IE8 正式版官方下载链接
  • IE8 视频
  • [Web开发] 快速修复网页在IE8 下的显示兼容问题
  • 用手机连pc localhost 学习,调试网站
  • [Web开发] Web开发者必读:《IE8 开发技术概述》
  • Web Server IIS Asp.Net Http Module 不工作
  • SqlServer中decimal(numeric )、float 和 real 数据类型的区别
  • 说说“315曝光中移动”的“阴谋论”
  • 网络管理的重要原则
  • 查找一个server下还有某个表名的数据库名字...
  • TD座机:我的憧憬和忧虑
  • 使用Watin做Web UI Automation Test
  • Linux常用命令学习笔记
  • [IE技巧] 如何关闭Windows Server版IE的安全限制
  • “大数据应用场景”之隔壁老王(连载四)
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • C++类的相互关联
  • gops —— Go 程序诊断分析工具
  • HTML中设置input等文本框为不可操作
  • iOS小技巧之UIImagePickerController实现头像选择
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • sublime配置文件
  • 每天一个设计模式之命令模式
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 使用Swoole加速Laravel(正式环境中)
  • 异步
  • ​ssh免密码登录设置及问题总结
  • ​渐进式Web应用PWA的未来
  • #13 yum、编译安装与sed命令的使用
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (三)终结任务
  • (一) springboot详细介绍
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (轉貼) UML中文FAQ (OO) (UML)
  • ./configure,make,make install的作用(转)
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .net core使用ef 6
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 依赖注入和配置系统
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • /etc/sudoers (root权限管理)
  • /var/spool/postfix/maildrop 下有大量文件
  • [20190113]四校联考
  • [APIO2015]巴厘岛的雕塑
  • [BZOJ 1040] 骑士
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配