• Authorize和AllowAnonymous


        [Authorize]
        public class HomeController : Controller
        {
            [AllowAnonymous]
            public ActionResult Login()
            {
                string userName = "admin";
                string password = "123456";
                //1.0 自动生成cookie
                FormsAuthentication.SetAuthCookie(userName, false);
    
                //2.0 手动生成cookie
                //设置ticket信息
                FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddMinutes(20), false, password);
                //加密
                string strTicket = FormsAuthentication.Encrypt(ticket);
                //生成cookie
                HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, strTicket);
                cookie.Expires = ticket.Expiration;
                Response.Cookies.Add(cookie);
    
    
                return View();
            }
    
    
            public ActionResult SignOut()
            {      

            //if (HttpContext.Request.IsAuthenticated)
            //{
            // string name = HttpContext.User.Identity.Name;
            // var data = ((FormsIdentity)HttpContext.User.Identity).Ticket.UserData;
            //}

                FormsAuthentication.SignOut();
                return View();
            }
        }

    AuthorizeAttribute源码

    http://www.cnblogs.com/icyJ/p/MVC_Authorize.html

    public virtual void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }
    
        if (OutputCacheAttribute.IsChildActionCacheActive(filterContext))
        {
            throw new InvalidOperationException(MvcResources.AuthorizeAttribute_CannotUseWithinChildActionCache);
        }
    
        bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true)
                                 || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true);
    
        if (skipAuthorization)
        {
            return;
        }
    
        if (AuthorizeCore(filterContext.HttpContext))
        {
            HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
            cachePolicy.SetProxyMaxAge(new TimeSpan(0));
            cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
        }
        else
        {
            HandleUnauthorizedRequest(filterContext);
        }
    }

    自己实现authentication

      public class ActionValidateAttribute:System.Web.Mvc.AuthorizeAttribute
        {
              #region 判断是否登陆和是否有权限
            /// <summary>
            /// 判断是否登陆和是否有权限
            /// </summary>
            /// <param name="filterContext"></param>
            public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
            {
                //1.0 获取区域名(全部验证)
                string strArea = filterContext.RouteData.DataTokens.Keys.Contains("area") ?
                    filterContext.RouteData.DataTokens["area"].ToString().ToLower() : null;
    
                string strController=filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower();
                string strAction=filterContext.ActionDescriptor.ActionName.ToLower();
                
                //1.1 需要验证区域的集合.根据情况而定,目前我们没有分区域,所以是全部验证          
                //1.2 判断请求路由是否包含在以上集合中           
                //2.0 判断是否包含skip特性(正常情况下登陆、登出skip)
                if(!DoesSkip<MyAuthentication.Attributes.SkipAttribute>(filterContext))
                {
                    //3.0 如果不跳过判断是否登陆状态
                    bool islogin = OperateContext.Current.IsLogin();
                    //3.1 如果没有登陆重定向到登陆页面
                    if (!islogin)
                    { filterContext.Result = OperateContext.Current.Redirect("/home/login", filterContext.ActionDescriptor); }
                    
                    ////4.0 已经登陆了,判断是否有权限
                    //bool hasPermission=OperateContext.Current.HasPermission(strArea,strController,strAction);
                    ////4.1 如果没有权限,重定向到登陆页面
                    //if(!hasPermission)
                    //{ filterContext.Result = OperateContext.Current.Redirect("/home/login", filterContext.ActionDescriptor); }          
                }
                //base.OnAuthorization(filterContext);
            } 
            #endregion
    
            #region 判断是否有skip特性+DoesSkip<T>(System.Web.Mvc.AuthorizationContext filterContext)
            /// <summary>
            /// 判断是否包含指定的特性
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="filterContext"></param>
            /// <returns></returns>
            protected bool DoesSkip<T>(System.Web.Mvc.AuthorizationContext filterContext) where T : Attribute
            {
                if (!filterContext.ActionDescriptor.IsDefined(typeof(T), false) &&
                    !filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(T), false))
                {
                    return false;
                }
                return true;
            } 
            #endregion
        }
     public class SkipAttribute:Attribute
        {
        }
  • 相关阅读:
    生成函数trick
    带权并查集维护二分图
    关于二项式反演的一些思考
    CSP集训记录
    解决Maven版本冲突
    蚂蚁金服5轮面试,最后栽这了...
    配置交换机Eth-Trunk+VRRP+MSTP+接口BFD状态联动+Telnet示例
    企业园区网络建设技术方案(华为)
    网络三层架构
    SOA治理
  • 原文地址:https://www.cnblogs.com/tgdjw/p/4628569.html
Copyright © 2020-2023  润新知