asp.net web form中 用attribute实现权限验证方式

以前项目的代码比较陈旧,今天抽空优化了一下.作为记录.

以前每次请求一个方法都要验证是否登录 if xxx等  现在通过global文件中的改进 反射这个方法的属性是否需要权限

要的话先验证权限.以下代码 只提供思路和演示.

如何使用

global中的写法是

  protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

            if (HttpContext.Current != null)
            {
                byte[] byts = new byte[HttpContext.Current.Request.InputStream.Length];

                HttpContext.Current.Request.InputStream.Read(byts, 0, byts.Length);
                string req = System.Text.Encoding.Default.GetString(byts);
                req = HttpContext.Current.Server.UrlDecode(req);
                if (!string.IsNullOrEmpty(req))
                {
                    req = req.Replace("data=", "");
                    var ajaxModel =  Utils.JsonHelper.FromJson<AjaxRequestModel>(req);//把请求的流转换为json
                    string methodName = ajaxModel.MethodAlias;
                    var className = AjaxCache.GetClassName(methodName);

                    string assemblyName = "Test.Module";

                    if (!String.IsNullOrEmpty(assemblyName) && !String.IsNullOrEmpty(className))
                    {
                        Assembly assembly = GetAssembly(assemblyName);//我这里用的缓存来实现资源加载的不然每次都需要反射
                        Type type = assembly.GetType(className, true, true);
                        if (type != null)
                        {
                            MethodInfo[] methodInfos = type.GetMethods();
                            foreach (MethodInfo mi in methodInfos)
                            {
                                System.Attribute[] attrs = System.Attribute.GetCustomAttributes(mi);  //反射获得用户自定义属性
                                foreach (System.Attribute attr in attrs)
                                {
                                    if (attr is CheckLoginAttribute)
                                    {
                                        CheckLoginAttribute a = (CheckLoginAttribute)attr;
                                        System.Console.WriteLine("过了没? ", a.IsLogin);//这里也可以处理 也可以不处理.
                                    }
                                }

                            }

                        }
                    }

                }
            }
        }
   /// <summary>
        /// 反射资源缓存调用
        /// </summary>
        /// <param name="assemblyName"></param>
        /// <returns></returns>
        private static Assembly GetAssembly(string assemblyName)
        {
            object assemblyObject = CacheHelper.GetCache(assemblyName);//这里可以用 iis缓存来实现

            if (assemblyObject == null)
            {
                Assembly assembly = null;
                assembly = Assembly.Load(assemblyName);
                CacheHelper.SetCache(assemblyName, assembly, DateTime.Now.AddMinutes(60));
                return assembly;
            }
            else
            {
                return (Assembly)assemblyObject;
            }
        }
 [AttributeUsage(AttributeTargets.Method,AllowMultiple=false, Inherited=true  )]
    public class CheckLoginAttribute : Attribute
    {

        /// <summary>
        /// 检测是否登录
        /// </summary>

        public bool IsLogin { get; set; }
        public   CheckLoginAttribute(  )
        {
            try
            {
                if (1==1)
                {
                    IsLogin = true;
                    //throw new Exception("登录错啦");
                    //var model = new ResponseInfo { State = ResultState.Failed, ErrorMessage = "您未登录,请登录!" };
                    //HttpContext.Current.Response.Write(JsonConvert.SerializeObject(model));
                    //HttpContext.Current.Response.End();
                }
                else
                {
                    HttpContext.Current.Response.Clear();
                    HttpContext.Current.Response.Write("{State:1,Msg=‘未登录‘}");
                    HttpContext.Current.Response.End();

                }

            }
            catch (Exception ex)
            {
                LogHelper.WriteExceptionLog("CheckLoginAttribute", ex);
                throw;
            }

        }

    }
时间: 2024-11-10 17:00:14

asp.net web form中 用attribute实现权限验证方式的相关文章

ASP.NET Web API中实现版本的几种方式

在ASP.NET Web API中,当我们的API发生改变,就涉及到版本问题了.如何实现API的版本呢? 1.通过路由设置版本 最简单的一种方式是通过路由设置,不同的路由,不同的版本,不同的controller. config.Routes.MapHttpRoute( name: "Food", routeTemplate: "api/v1/nutrition/foods/{foodid}", defaults:... ) config.Routes.MapHttp

ASP.NET Web Form和MVC中防止F5刷新引起的重复提交问题

转载  http://www.cnblogs.com/hiteddy/archive/2012/03/29/Prevent_Resubmit_When_Refresh_Reload_In_ASP_NET_Web_Form_MVC.html 什么是刷新/重新载入 IE中的刷新(Refresh),在FF和Chrome中称为重新载入(Reload),与正常进入页面的区别在于以下两点: 1. 缓存控制 如果文件(比如图片)在本地缓存中已经存在,正常进入页面会不访问服务器而直接从本地加载.而对于刷新操作,

Asp.net web form url route使用总结

asp.net web form 使用URL路由 注不是mvc中的路由 一.前台控件使用路由,通过表达式生成url地址,注意给路由参数赋值,防止使用了其他路由表达式值方式1:<asp:HyperLink ID="hlSupply" NavigateUrl='<%$RouteUrl:routename=TechSupplySearch,areacode=,techfield=%>'                runat="server">技

ASP.NET Web API中的参数绑定总结

ASP.NET Web API中的action参数类型可以分为简单类型和复杂类型. HttpResponseMessage Put(int id, Product item) id是int类型,是简单类型,item是Product类型,是复杂类型. 简单类型实参值从哪里读取呢?--一般从URI中读取 所谓的简单类型包括哪些呢?--int, bool, double, TimeSpan, DateTime, Guid, decimal, string,以及能从字符串转换而来的类型 复杂类型实参值从

ASP.NET Web API实践系列01,以ASP.NET Web Form方式寄宿

创建一个空的ASP.NET Web Form项目. 右键项目,添加新项,创建Web API控制器类,TestController. 删除掉TestController默认的内容,编写如下: using System.Web.Http; namespace WebApplication1 { public class TestController : ApiController { [AcceptVerbs("Get")] public string SayHello() { retur

【ASP.NET Web API教程】4.3 ASP.NET Web API中的异常处理

参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-delete.html http://www.yuanjiaocheng.net/webapi/Consume-web-api.html http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-get.html http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-po

关于asp.net web form 和 asp.net mvc 的区别

asp.net web forms 有什么缺陷? 1.视图状态臃肿:服务器和客户端传输过程中包含了大量的试图状态——在现在的web程序中甚至多达几百kb,而且每次往返都会请求,导致服务器请求带宽增加,减慢服务器与客户端交互速度. 2.页面生命周期复杂:客户端事件和服务器事件之间的控制代码以及部分页面的生命周期关系复杂而微妙,一旦出现错误,很少有程序员能够成功的控制状态找到问题. 3.不完全的代码分离:asp.net web forms 的前后台代码分离将前台展现代码和后台业务逻辑分开很不错,但是

如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites]

如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites] 一.布局页面介绍[About Layout Pages] 很多网站有些内容需要显示在各个页面中,比如Header,Footer或者告诉用户已经登录的部分.ASP.NET允许你创建一个单独的文件来包含文本.标签和代码的内容块,从而搭建一个风格整齐的网站.接下来你就可以将这个内容块插入到任何你想要让它展示的页面中.采用这种方法

添加asp.net mvc到现有的asp.net web form 应用程序

前言 asp.net mvc的前一版本为asp.net web Form(Asp.net mvc之前称为asp.net),其第一个版本与2002年年初发布.asp.net web form 属于.net框架的一部分.在接下来的十余年,asp.net web form框架稳步发展,不去越来越多的网站均采用asp.net 框架.几年后,新的web开发框架asp.net mvc 发布.如果想将asp.net mvc添加到现有的asp.net web form 系统中怎么办呢? 正文 如果想避免风险,想