Asp.net Controller中View 和Action方法认证Authorize 及对AuthorizeAttribute扩展

Asp.net Controller中View和Action方法认证Authorize

  在建立Web 站点安全性时

1、登录后才可访问系统文件 ——限制 Forms认证

<authentication mode="Forms">
<forms timeout="800" loginUrl="/Login/Index" path="/" protection="All" name="FinancialServicep.Web" slidingExpiration="true" />
</authentication>

2、增加Controller 、Action级别角色、权限、用户认证,下面描述一下角色认证

    一、首先在登录时将 角色及相关信息存储如下代码,这里因为系统中需要客户信息较多 所以存储较多 ,仅关心roleCode及可。

  // 设置 FormsAuthentication认证
  FormsAuthentication.SetAuthCookie(loginM.LoginId + "#" + loginM.UserName + "#" + loginM.UserId + "#" + loginM.OrgId + "#" + loginM.OrgType + "#" + loginM.IsSensitive+"#"+ roleCode, false);

  二、增加AuthorizeAttribute扩展认证  过滤器。

  

复制代码
  public class CheckAuthentication : AuthorizeAttribute
    {
        public string[] checkRoles;
        public override void OnAuthorization(AuthorizationContext httpContext)
        {
            // 获取请求该方法所需角色
            checkRoles = Roles.Split(',');

            string controllerName = httpContext.ActionDescriptor.ControllerDescriptor.ControllerName;
            string actionName = httpContext.ActionDescriptor.ActionName;
           
            
            base.OnAuthorization(httpContext);
        }
      
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {

            if (httpContext == null)
            {
                throw new ArgumentNullException("HttpContext");
            }
            if (!httpContext.User.Identity.IsAuthenticated)
            {
                return false;
            }
            if (Roles == null)
            {
                return true;
            }
            if (Roles.Length == 0)
            {
                return true;
            }
            if (checkRoles.Any(httpContext.User.IsInRole))
            {
                return true;
            }
             

            foreach (var item in checkRoles)
            {
                
                if (WebContext.RoleCode == item)
                {
                    return true;
                }
            }
            return false;
        }

        /// <summary>
        /// 没有权限用户跳转到登录
        /// </summary>
        /// <param name="filterContext"></param>
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            base.HandleUnauthorizedRequest(filterContext);
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }
            else
            {
                filterContext.HttpContext.Response.Redirect("/Login/Index");
            }
        }


    }
}
复制代码

  三、Controller 或Action 加角色限制调用过滤器及可。

 

        // GET: FinancingLoan
        [CheckAuthentication(Roles = "Manager,Inv")]
        public ActionResult Index()
        {
            ViewBag.MenuCode = "Menu0018";
            return View();
        }

这样做提高了系统访问安全性,Forms认证 限制了未登录用户不可访问网站各功能页,结合CheckAuthentication 过滤器认证 限制了没角相关功能访问角色的用户不可访问。

如有问题及时沟通讨论在评论区,也可加QQ:626382542

 

posted @   xiaoBai1001  阅读(622)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示