• HttpModule,对ASP.NET的事件处理进行过滤,干预


    HttpModule通过对HttpApplication对象的一系列事件的处理来对HTTP处理管道施加影响。这些事件要在HttpModuleInit方法中进行注册,包括:BeginRequestAuthenticateRequest AuthorizeRequest ResolveRequestCache AcquireRequestState PreRequestHandlerExecute PostRequestHandlerExecute ReleaseRequestState UpdateRequestCache EndRequest

    using System;
    using System.Web;
    using System.Security.Principal;

    namespace xumh
    {
        
    /// <summary>
        
    /// 
        
    /// 实现HttpModule:
        
    /// 1、编写类实现IHttpModule
        
    /// 2、编译为类库:csc /t:library testhttpmodule.cs
        
    /// 3、要让你的WEB页面使用它,必须在web.config中注册。
        
    /// <httpModules> 
        
    /// <add name="xumhHttpModule" type="xumh.testHttpModule,testHttpModule"/>
        
    /// <add name="随便起个名字" type="空间.类名,dll文件不带扩展名 />
        
    /// </httpModules>
        
    /// 4、本HttpModule处理注册,为方便测试需要禁用匿名访问,如下:
        
    ///        <authorization>
        
    ///             <deny users="?"/>
        
    ///        </authorization>
        
    /// </summary>
        public class testHttpModule : IHttpModule
        {
            
    public void Dispose()
            {
                
    throw new NotImplementedException();
            }

            
    public void Init(HttpApplication context)
            {
    //里面我们可以注册很多的事件
                context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
            }

            
    //AuthenticateRequest
            void context_AuthenticateRequest(object sender, EventArgs e)
            {
                HttpApplication app 
    = (HttpApplication)sender;
                HttpContext context 
    = (HttpContext)app.Context;
                
    if ( app.Request["userid"== null || app.Request["password"==null)
                {
                    context.Response.Write(
    "用户名或者密码为空,验证失败!");
                    app.Response.End();
                }
                
    //
                string userid = app.Request["userid"].ToString();
                
    string password = app.Request["password"].ToString();
                
    string[] roles = AuthenticateAndGetRoles(userid, password);//获取用户权限表
                if (roles==null || roles.GetLength(0==0)
                {
                    app.Response.Write(
    "用户名或者密码错误,验证失败!");
                    app.CompleteRequest();
    //终止一个http请求
                }
                GenericIdentity identity 
    = new GenericIdentity(userid, "CustomAuthentication");
                context.User 
    = new GenericPrincipal(identity, roles);

            }

            
    //AuthenticateAndGetRoles
            private string[] AuthenticateAndGetRoles(string userid, string password)
            {
                
    string[] roles = null;
                
    if (userid.Equals("xuminghui"&& password.Equals("1234"))
                {
                    roles 
    = new string[1];
                    roles[
    0= "Administrator";
                }
                
    else if (userid.Equals("haohao"&& password.Equals("1017"))
                {
                    roles 
    = new string[1];
                    roles[
    0= "User";
                }
                
    return roles;
            }

        }

    }
    详细处理流程见下图



  • 相关阅读:
    分布式事务之最终一致性BASE理论
    CAP理论
    Comparator中返回0导致数据丢失的大坑
    电脑主板分类
    SimpleDateFormat线程不安全
    Redis面试题
    JS闭包
    ES6将两个数组合并成一个对象数组
    视频色彩空间RGB、YUV、YCbCr
    c#接口作用的深入理解
  • 原文地址:https://www.cnblogs.com/flaaash/p/996961.html
Copyright © 2020-2023  润新知