赞
踩
.net MVC下鉴权认证下鉴权认证传统的方法一般我们是通过认证过滤器来实现的,这在.net framework或者.net core下其实都可以这么来。
.net framwork下可以通过继承AuthorizeAttribute来自定义一个UserAuthorizeAttribute来实现认证权限控制
- namespace MyMis.Filters
- {
- public class UserAuthorizeAttribute : AuthorizeAttribute
- {
- public override void OnAuthorization(AuthorizationContext filterContext)
- {
- var controller = filterContext.RouteData.Values["controller"].ToString();
- var action = filterContext.RouteData.Values["action"].ToString();
-
- //判断action上是否有特性
- //可以直接定义某个定性来设定是否允许某个Action可以匿名访问 特性名称自己命名就行
- var actionAttrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(CheckAttribute), false);
- if (actionAttrs.Count() > 0){
- //有此特性可以自己处理
- }
-
- var flag = true;
- //此处可以加上自己的验证逻辑来进行判断是否登录或者是否授权访问某个Action
-
- if (!flag) {
- filterContext.RequestContext.HttpContext.Response.Write("你目前无权访问");
- filterContext.RequestContext.HttpContext.Response.End();
- filterContext.Result = new EmptyResult();
- }
- }
- }
- }
然后在需要加权限控制的Controller上或者Action上加上[UserAuthorize]特性就可以实现鉴权控制了。
.net core下其实也差不多,我们可以实现IAuthorizationFilter这个接口来定义认证过滤器进行鉴权控制。
- public class UserAuthorizeAttribute : Attribute,IAuthorizationFilter {
-
- public UserAuthorizeAttribute() {
-
- }
-
- public void OnAuthorization(AuthorizationFilterContext context) {
- var controller = context.RouteData.Values["controller"].ToString();
- var action = context.RouteData.Values["action"].ToString();
-
- //判断action上是否有特性checklogin
- //可以直接定义某个定性来设定是否允许某个Action可以匿名访问 特性名称自己命名就行
- CheckAttribute actionAttr = (CheckAttribute)((Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor)context.ActionDescriptor).MethodInfo.GetCustomAttribute(typeof(CheckAttribute), false);
- //var actionAttrs = type.GetCustomAttributes(typeof(CheckAttribute), false);
- //string result = "1";
- if (actionAttr != null) {
- var attr = actionAttr as CheckAttribute;
- //有此特性可以自己处理
- //...
- }
- string userid = UserInfo.GetCurrentUser();
- if (string.IsNullOrEmpty(userid))//未登录提示
- {
- //判断是什么请求,进行响应的页面跳转
- if (IsAjaxRequest(context.HttpContext.Request)) {
- context.Result = new JsonResult(new {
- status = "error",
- message = "您没有权限"
- });
- }
- else {
- var v_result = new ViewResult { ViewName = "~/Views/Shared/Error.cshtml" };
- context.Result = v_result;
- }
- }
- else {
- //判断是什么请求,进行响应的页面跳转
- if (IsAjaxRequest(context.HttpContext.Request)) {
- context.Result = new JsonResult(new {
- status = "error",
- message = "您还未登陆"
- });
- }
- else {
- var v_result = new ViewResult { ViewName = "~/Views/Shared/Error.cshtml" };
- context.Result = v_result;
- }
- }
-
- }
- /// <summary>
- /// 判断该请求是否是ajax请求
- /// </summary>
- /// <returns></returns>
- private bool IsAjaxRequest(HttpRequest request) {
- string header = request.Headers["X-Requested-With"];
- return "XMLHttpRequest".Equals(header);
- }
- }
然后在Startup.cs中加上注册下services.AddScoped<UserAuthorizeAttribute>();
然后在需要的controller或action加上特性就可以了,然后这个特性的写法和.net稍微有点差异
[ServiceFilter(typeof(UserAuthorizeAttribute))]
这样就完成了,具体如何权限管控可以自己再过滤器里实现,这里只是讲了可以通过这种方法来实现。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。