ASP.NET MVC授权登录过滤器OnAuthorization过滤器AuthorizeAttribute使用

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Autofac;
using WuZiFenGongSiInfomation.Common;
using WuZiFenGongSiInfomation.IBll;
using WuZiFenGongSiInfomation.Models.Veiw;

namespace WuZiFenGongSiInfomation.Models
{
    /// <summary>
    /// 登录验证,权限验证,action过滤
    /// </summary>
    public class LoginFilter:  AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext) {
            //判断是否跳过授权过滤器
            if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
                || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))
            {
                return;
            }

            var session = filterContext.HttpContext.Session;
            bool isAjax = filterContext.HttpContext.Request.IsAjaxRequest();

            bool IsAuthenticated = filterContext.HttpContext.User.Identity.IsAuthenticated;
            if (!IsAuthenticated)
            {
                if (isAjax)
                {
                    filterContext.HttpContext.Response.StatusCode = 801;
                    filterContext.Result = new EmptyResult();
                    filterContext.HttpContext.Response.ContentType = "application/json;charset=UTF-8";
                    filterContext.HttpContext.Response.Write("{\"Code\":500,\"Msg\":\"登录失效,请重新登录\"}");
                    filterContext.HttpContext.Response.End();
                }
                else
                {
                    filterContext.Result = new RedirectResult("/user/login");
                }
                return;
            }

            string userId = filterContext.HttpContext.User.Identity.Name;
            UserView loginUser = MemoryCacheProvider.GetOrAddCacheItem<UserView>(userId, () =>
            {
                IAnUserBll anUserBll = DependencyResolverHelpter.container.Resolve<IAnUserBll>();
                var model = anUserBll.GetUserById(userId);

                //如果是超级管理员,则不继续验证     2019-10-31 11:30:01 添加 
                string superAdmin2 = CommonData.SuperAdmin;
                if (model != null)
                {
                    string currentAccount2 = model.Account;
                    if (currentAccount2.Equals(superAdmin2))
                    {
                        model.Functions?.Clear();
                        model.Meuns = CommonData.MenusList;
                        model.Functions = CommonData.MenusList.Select(x => x.Id).ToList();
                    }
                }

                return model;
            }, null, DateTime.UtcNow.AddSeconds(7200));

            if (loginUser == null)
            {
                MemoryCacheProvider.Remove(userId);
                System.Web.Security.FormsAuthentication.SignOut();
                filterContext.Result = new RedirectResult("/user/Login");
                return;
            }

            //请求的地址
            string url = filterContext.HttpContext.Request.RawUrl;

            //如果是超级管理员,则不继续验证      2019-10-31 10:25:52 添加 
            string superAdmin = CommonData.SuperAdmin;
            string currentAccount = loginUser.Account;
            if (currentAccount.Equals(superAdmin))
            {
                return;
            }

            //需要登录,但不验证权限
            if (Roles.Equals("pass"))
            {
                return;
            }

            //验证用户角色是否被禁用
            IAnRoleBll anRoleBll = DependencyResolverHelpter.container.Resolve<IAnRoleBll>();
            AnRole role = anRoleBll.Get(loginUser.RoleId);
            if (role != null && role.Status == 0)
            {
                filterContext.Result = new EmptyResult();
                filterContext.HttpContext.Response.Write("<h3>你的角色被禁用</h3>");
                filterContext.HttpContext.Response.StatusCode = 401;            
                filterContext.HttpContext.Response.End();
                return;
            }

            //验证用户权限
            bool access = loginUser.Functions.Contains(Roles);
            if (!access)
            {
                if (isAjax)
                {                   
                    filterContext.HttpContext.Response.ContentType = "application/json;charset=UTF-8";
                    filterContext.HttpContext.Response.Write("{\"Code\":500,\"Msg\":\"你没有此操作权限\"}");
                }
                else
                {
                    filterContext.HttpContext.Response.Write("<h3>你没有此操作权限</h3>");
                }
                filterContext.HttpContext.Response.StatusCode = 401;
                //阻止执行后续的action
                filterContext.Result = new EmptyResult();
                filterContext.HttpContext.Response.End();
            }
        }

    }
}

 webconfig配置文件设置FormsAuthentication节点

 <system.web> 
    <authentication mode="Forms">
      <!--分钟-->
      <forms name=".UserInfo"  timeout="120" slidingExpiration="true"   path="/"  />    
    </authentication>
  </system.web>

 

登录action参考

public async Task<ActionResult> LoginDo(LoginInput input)
{     
	Result<UserView> result = await anUserBll.LoginDoAsync(input);
	if (result.Code == 200)
	{
	    //登录成功写入cookie认证
		string loginAuthTxt = result.Data.Id;
		FormsAuthentication.SetAuthCookie(loginAuthTxt, true);
	}
	return Json(result);
}

 

 

使用过滤器在调用action之前,验证权限、登录没有,Roles = "140040070"是权限值,表示用户的权限值集合中是否具有这个权限值,有就表示可以访问此action

//确认页面
[LoginFilter(Roles = "140040070")]
public async Task<ActionResult> ConfirmView(string id)
{ 
	return View();
}

前端页面$.ajax状态码重写弹出验证消息

  <script type="text/javascript">
        (function ($) {
            var _ajax = $.ajax;
            $.ajax = function (opt) {
                //扩展增强处理
                var _opt = $.extend(opt, {
                    statusCode: { 
                        401: function () {
                            console.log('您没有权限进行此项操作');
                            alert("您没有权限进行此项操作");
                            //window.location.reload();
                        },
                        801: function () {
                            console.log('登录失效,请重新登录');
                            alert("登录失效,请重新登录");
                        }
                    }
                });
                _ajax(_opt);
            };
        })(jQuery);
    </script>

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面我给你写一个实现登录验证的MVCAuthorization过滤器的案例。 首先,我们需要创建一个自定义的Authorization过滤器类,代码如下: ```csharp using System.Web.Mvc; namespace YourNamespace { public class LoginAuthorization : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { if (filterContext.HttpContext.Session["UserID"] == null) // 判断用户是否登录 { filterContext.Result = new RedirectResult("~/Account/Login"); // 如果用户未登录,则跳转到登录页面 } } } } ``` 在上面的代码中,我们继承了AuthorizeAttribute类,并重写了其中的OnAuthorization方法。在这个方法中,我们判断了用户是否已经登录,如果未登录,则跳转到登录页面。 接下来,我们需要在需要登录验证的控制器或者方法上加上我们刚才创建的Authorization过滤器,代码如下: ```csharp using System.Web.Mvc; namespace YourNamespace.Controllers { [LoginAuthorization] // 加上我们创建的Authorization过滤器 public class HomeController : Controller { public ActionResult Index() { return View(); } } } ``` 在上面的代码中,我们在HomeController控制器上加上了我们创建的Authorization过滤器,表示这个控制器中的所有方法都需要登录验证。 最后,我们需要在登录页面中验证用户的用户名和密码,并将登录成功的用户ID存储到Session中,代码如下: ```csharp using System.Web.Mvc; using YourNamespace.Models; namespace YourNamespace.Controllers { public class AccountController : Controller { [HttpGet] public ActionResult Login() { return View(); } [HttpPost] public ActionResult Login(LoginViewModel model) { if (ModelState.IsValid) { // 在这里验证用户的用户名和密码是否正确 // 如果正确,则将用户ID存储到Session中 Session["UserID"] = 123; return RedirectToAction("Index", "Home"); } else { return View(model); } } } } ``` 在上面的代码中,我们首先创建了一个LoginViewModel类,用于存储用户输入的用户名和密码。然后,在Login方法中,我们首先判断用户输入的数据是否合法,如果合法,则验证用户名和密码是否正确,并将用户ID存储到Session中,最后跳转到首页。如果用户输入的数据不合法,则返回登录页面,并显示相应的错误信息。 好了,现在我们已经实现了一个简单的MVCAuthorization过滤器,用于实现登录验证的功能。当用户访问需要登录验证的页面时,如果未登录,则会自动跳转到登录页面,登录成功后再跳转回原来的页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王焜棟琦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值