asp.net webapi 全局设置 所有api controller安全认证的方法、判断是否登录的方法

asp.net webapi 全局设置 所有api controller安全认证的方法、判断是否登录的方法

1. 新建AuthAttribute 特性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class AuthAttribute : ActionFilterAttribute
    {
        public AuthAttribute()
        {
 
        }
 
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var Context = (HttpContextBase)actionContext.Request.Properties["MS_HttpContext"];
            if (SkipAuth(actionContext))//是否该类标记为NoAuch
            {
                base.OnActionExecuting(actionContext);
                return;
            }
            //前端只要把登录成功后获取到的logintoken放入headers里传入即可。不影响正常post get的参数
            var logintoken = actionContext.Request.Headers.Contains("logintoken") ?
                actionContext.Request.Headers.GetValues("logintoken").First() : "";
            var result = Auth(logintoken);
            if (string.IsNullOrEmpty(logintoken) || result.Status != JsonModelHelper.EJsonModel.Auth)
            {
                Context.Response.ContentType = "application/json";
                Context.Response.Write(JsonConvert.SerializeObject(new JsonModelHelper.JsonModel { Status = JsonModelHelper.EJsonModel.Fail, Information = "失败, 登录信息已过期,请重新登录" }));
                Context.Response.End();<br>                actionContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.NoContent); //加上这句,就不会再执行目标action了
            }
 
           // base.OnActionExecuting(actionContext);
        } /// <summary>
        /// 判断类和方法头上的特性是否要进行Action拦截
        /// </summary>
        /// <param name="actionContext"></param>
        /// <returns></returns>
        private static bool SkipAuth(HttpActionContext actionContext)
        {
            return actionContext.ActionDescriptor.GetCustomAttributes<NoAuthAttribute>().Any() || actionContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes<NoAuthAttribute>().Any();
        }
}

2. 新增NoAuthAttribute 特性

1
2
3
4
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true)]
    public class NoAuthAttribute : AuthAttribute
    {
    }

3. 在app_start/WebApiConfig.cs中配置auth过滤全局action

1
2
3
4
5
6
7
8
9
public static class WebApiConfig
 {
        public static void Register(HttpConfiguration config)
        {
            // Web API 配置和服务
            //设置全局过滤器
            config.Filters.Add(new AuthAttribute());
        }
}

4. 设置logincontroller不判断登录状态

1
2
3
4
5
6
7
8
9
10
[NoAuth]
public partial class LoginController : ApiController
{
       /// <summary>
        /// 登录
        /// </summary>
        /// <param name="adminuser">adminuser</param>
        /// <returns></returns>
        public int Post(adminuser adminuser){return 1;}
}

  

posted @   iDEAAM  阅读(322)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
历史上的今天:
2014-09-07 解决高版本 Google Chrome 扩展程序强制停用问题 -摘自网络
点击右上角即可分享
微信分享提示