zoukankan      html  css  js  c++  java
  • cs-Filters

    ylbtech-Unitity: cs-Filters

    HealthcareAuthorizeAttribute.cs

    HealthcareHandleErrorAttribute.cs

    HealthcareJSONHandleErrorAttribute.cs

    1.A,效果图返回顶部
     
    1.B,源代码返回顶部
    1.B.1,HealthcareAuthorizeAttribute.cs
    using Healthcare.Framework.Web.Mvc.Authentication;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web.Mvc;
    using System.Web.Security;
    
    namespace Healthcare.Framework.Web.Mvc
    {
        public class HealthcareAuthorizeAttribute : AuthorizeAttribute
        {
            public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
            {
                //So now we are validating for secure part of the application
                var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
                var actionName = filterContext.ActionDescriptor.ActionName;
                var controllerType = filterContext.Controller;
    
                //skip authorization for specific part of application, which have deliberately marked with [SkipAuthorizaion] attribute
                if (filterContext.ActionDescriptor.IsDefined(typeof(SkipAuthorizaionAttribute), true)
                    || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(SkipAuthorizaionAttribute), true))
                {
                    return;
                }
                //filterContext.HttpContext.Session["User"] = new Users()
                //{
                //    EmployeeId = "79",
                //    EmployeeName = "Tom",
                //    LoginId = "2",
                //    LoginName = "Tom.xu",
                //    OrganizationID = "90",
                //    OrganizationCode = "01",
                //    OrganizationName = "总院"
                //};
    #if DEVBOX
                filterContext.HttpContext.Session["User"] = new Users() { EmployeeId = "79", EmployeeName = "Tom", LoginId = "2", LoginName = "Tom.xu",
                OrganizationID="90",OrganizationCode="01",OrganizationName="总院"};
    #endif
    
                if( filterContext.HttpContext==null)
                {
                    throw new MvcException("用户登录过期,请重新登录!");
                }
    
                if (filterContext.HttpContext == null
                    || filterContext.HttpContext.Session == null
                    || filterContext.HttpContext.Session["User"] == null
                    || !(filterContext.HttpContext.Session["User"] is Users)
                    || (filterContext.HttpContext.Session["User"] as Users) == null  )
                {
                    if (filterContext.HttpContext.Request.IsAjaxRequest())
                    {
                        throw new MvcException ("用户登录过期,请刷新窗口以后重新登录!");
                    }
                    else
                    {
                        filterContext.HttpContext.Session["RequestOldUrl"] = filterContext.HttpContext.Request.Url;
                        //filterContext.HttpContext.Session["RequestOldUrl"] = filterContext.HttpContext.Request.UrlReferrer;
                        
                        filterContext.Result = new RedirectResult("~/Account/LogOn"); //new HttpUnauthorizedResult("用户未登陆!");
                        return;                    
                    }
                }
    
                var user = filterContext.HttpContext.Session["User"] as Users;
    
                if (filterContext.ActionDescriptor.IsDefined(typeof(PermissionsAttribute), true)
                     || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(PermissionsAttribute), true))
                {
                    var controllerAttribute = filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(PermissionsAttribute), true).Cast<PermissionsAttribute>().FirstOrDefault();
                    var actionAttribute = filterContext.ActionDescriptor.GetCustomAttributes(typeof(PermissionsAttribute), true).Cast<PermissionsAttribute>().FirstOrDefault();
                    if (!IsUserAuthorized(user, controllerAttribute, actionAttribute))
                    {
                        throw new NoPermissionException("用户无权进行操作!");
                    }
                }
    
                // base.OnAuthorization(filterContext);
            }
    
            private static bool IsUserAuthorized(Users user, PermissionsAttribute controllerPermissions, PermissionsAttribute actionPermissions)
            {
                var effective = PermissionsAttribute.Merge(controllerPermissions, actionPermissions);
    
                if (effective.Allow.Length == 0)
                    return false;
    
                bool isUserAuthorized = effective.Allow.All(user.HasPermission);
                return isUserAuthorized;
            }
        }
    
        [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
        public sealed class SkipAuthorizaionAttribute : Attribute { }
    
        [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
        public class PermissionsAttribute : Attribute
        {
            public PermissionsAttribute(params string[] allow)
            {
                Allow = allow ?? new string[0];
            }
    
            public string[] Allow { get; private set; }
    
            public static PermissionsAttribute Merge(params PermissionsAttribute[] permissions)
            {
                if (permissions == null)
                {
                    return new PermissionsAttribute();
                }
    
                var allNotNullPermissions = permissions.Where(p => p != null);
    
                if (!allNotNullPermissions.Any())
                {
                    return new PermissionsAttribute();
                }
    
                return new PermissionsAttribute
                {
                    Allow = allNotNullPermissions.Aggregate(new List<string>(),
                                                  (list, permissionsAttribute) =>
                                                  {
                                                      list.AddRange(permissionsAttribute.Allow);
                                                      return list;
                                                  }).ToArray()
                };
            }
        }
    }
    View Code

    1.B.2,HealthcareHandleErrorAttribute.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web.Mvc;
    using System.Web;
    using Elmah;
    
    namespace Healthcare.Framework.Web.Mvc
    {
        public class HealthcareHandleErrorAttribute : FilterAttribute, IExceptionFilter
        { 
            // private Lazy<ILogger> logger = new Lazy<ILogger>(() => KernelContainer.Kernel.Get<ILogger>());
    
            public virtual void OnException(ExceptionContext filterContext)
            {
                string controllerName = filterContext.RouteData.Values["Controller"] as string;
                string actionName = filterContext.RouteData.Values["action"] as string;
    
                if (!filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
                    filterContext.Result = new ViewResult
                    {
                        ViewName = "Error",
                        ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
                        TempData = filterContext.Controller.TempData,
                        //ViewData["aa"] = filterContext.Controller.ViewBag.asd
                    };
                    filterContext.ExceptionHandled = true;
                }
    
                                                                 
    
                if (!filterContext.ExceptionHandled
                || TryRaiseErrorSignal(filterContext)
                || IsFiltered(filterContext))
                    return;
    
    
    
                if (filterContext.ExceptionHandled)
                {
                    if (TryRaiseErrorSignal(filterContext) || IsFiltered(filterContext))
                        return;
    
                    LogException(filterContext);
    
                    //自定义日志
                    //Logging.ErrorLoggingEngine.Instance().Insert("action:" + actionName + ";sessionid:" + (filterContext.HttpContext.GetHttpSessionId()), filterContext.Exception);
                }
    
    
            }
    
            private static bool TryRaiseErrorSignal(ExceptionContext context)
            {
                var httpContext = GetHttpContextImpl(context.HttpContext);
                if (httpContext == null)
                    return false;
                var signal = ErrorSignal.FromContext(httpContext);
                if (signal == null)
                    return false;
                signal.Raise(context.Exception, httpContext);
                return true;
            }
    
            private static bool IsFiltered(ExceptionContext context)
            {
                var config = context.HttpContext.GetSection("elmah/errorFilter")
                                as ErrorFilterConfiguration;
    
                if (config == null)
                    return false;
    
                var testContext = new ErrorFilterModule.AssertionHelperContext(
                                      context.Exception,
                                      GetHttpContextImpl(context.HttpContext));
                return config.Assertion.Test(testContext);
            }
    
            private static void LogException(ExceptionContext context)
            {
                var httpContext = GetHttpContextImpl(context.HttpContext);
                var error = new Error(context.Exception, httpContext);
                ErrorLog.GetDefault(httpContext).Log(error);
            }
    
            private static HttpContext GetHttpContextImpl(HttpContextBase context)
            {
                return context.ApplicationInstance.Context;
            }
        }
    }
    View Code

    1.B.3,HealthcareJSONHandleErrorAttribute.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web.Mvc;
    
    namespace Healthcare.Framework.Web.Mvc
    {
        public class HealthcareJSONHandleErrorAttribute : HealthcareHandleErrorAttribute
        { 
            public HealthcareJSONHandleErrorAttribute()
                : base()
            {
            }
    
            public override void OnException(ExceptionContext filterContext)
            {
                Controller controller = filterContext.Controller as Controller;
                Exception exception = filterContext.Exception;
    
                if (controller != null)
                {
                    controller.Response.TrySkipIisCustomErrors = true;
                    controller.Response.StatusCode = (int)HttpStatusCode.AjaxErrorResult;
    
                    object resultData;
                    if (exception.GetType() == typeof(System.TimeoutException))
                    {
                        resultData = new
                        {
                            DisplayMessage = "系统超时",
                            DetailMessage = exception.ToString(),
                        };
                    }
                    else
                    {
                        MvcException mvcException = exception as MvcException;
    
    
                        if (mvcException != null)
                        {
                            resultData = mvcException.GetClientResultData();
                        }
                        else
                        {
                            resultData = new
                            {
                                DisplayMessage = "未知错误",
                                DetailMessage = exception.ToString(),
                            };
                        }
                    }
                    filterContext.Result = new JsonResult { Data = resultData, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
    
                    filterContext.ExceptionHandled = true;
                }
    
                base.OnException(filterContext);
            }
        }
    }
    View Code

    1.B.4,

    1.C,下载地址返回顶部

     

    warn 作者:ylbtech
    出处:http://ylbtech.cnblogs.com/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    8月份的To-Do List
    Block作为返回值时的使用
    Block作为参数时的使用
    AFNetwork 作用和用法详解
    UIScrollView监听静止的数种情况
    UIAppearance
    自定义Log实现条件编译
    事件的基本概念
    ubuntu16.04下安装MySQL
    在Ubuntu16.04下搭建samba,实现linux与windows之间的资源共享
  • 原文地址:https://www.cnblogs.com/ylbtech/p/4079513.html
Copyright © 2011-2022 走看看