总结一下上一个项目中对webapi 用户登录权限控制的设计
目的:前端可以根据接口的状态码来判断用户的登录状态,以及访问权限
1.首先我们在webconfig里面添加一条配置,用于开启或关闭权限控制
<appSettings> <add key="WebApiAuthFlag" value="true" />
</appSettings>
2.先了解一下 ActionFilterAttribute 这个类,该类可以在action方法执行前后进行拦截
// // 摘要: // 表示所有操作筛选器特性的基类。 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IFilter { // // 摘要: // 初始化 System.Web.Http.Filters.ActionFilterAttribute 类的新实例。 protected ActionFilterAttribute(); // // 摘要: // 在调用操作方法之后发生。 // // 参数: // actionExecutedContext: // 操作执行的上下文。 public virtual void OnActionExecuted(HttpActionExecutedContext actionExecutedContext); public virtual Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken); // // 摘要: // 在调用操作方法之前发生。 // // 参数: // actionContext: // 操作上下文。 public virtual void OnActionExecuting(HttpActionContext actionContext); public virtual Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken); }
3.明白上面那个类的作用后,我们可以在Filter文件夹下新建一个类(不一定非得在Filter文件夹下,可以任意位置),并继承于上面那个类,对OnActionExecuting方法进行重写,此时该类就是一个过滤器。
使用方法:
1.全局过滤:在FilterConfig类里进行注册。
2.局部过滤:在一个类或者方法上方添加该过滤器名称的标签即可实现过滤。
public class BasicAuthenticationAttribute : ActionFilterAttribute { /// <summary> /// 检查用户是否有该Action执行的操作权限 /// </summary> /// <param name="actionContext"></param> public override void OnActionExecuting(HttpActionContext actionContext) { bool isRquired = false; try { //获取刚才在webconfig中的添加的权限开关 isRquired = WebConfigurationManager.AppSettings["WebApiAuthFlag"].ToString().ToBool(); } catch (Exception ex) { //抛出异常 } //如果开启... if (isRquired) { bool isLogin = false; //用户登录验证 //代码..... //代码..... //代码..... //isLogin = true or false; if (isLogin) { //如果已经登录,则跳过验证 base.OnActionExecuting(actionContext); } else { //如果请求Header不包含ticket,则判断是否是匿名调用 var attr = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().OfType<AllowAnonymousAttribute>(); bool isAnonymous = attr.Any(a => a is AllowAnonymousAttribute); //是匿名用户,则继续执行;非匿名用户,抛出“未授权访问”信息 ( 抛出401 ) if (isAnonymous) base.OnActionExecuting(actionContext); else actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized); } } } }
上面都结束之后,我们可以开始写我们自己的api类了。
4.首先新建一个api类,并在类的上方加上标签,即我们刚上面建的那个过滤器的名称
using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Web.Http;using Test.Filters;//引入过滤器所在空间namespace Test.api{ //添加过滤器标签,对当前类里的所有方法进行过滤验证 [BasicAuthenticationAttribute] public class MemberController : ApiController { //执行该方法前,会进行权限验证 public int GetMemberId() { return 0; } //如果给方法单独添加AllowAnonymous标签,则该方**跳过验证,直接执行 [AllowAnonymous] public string GetMemberName() { return "Bob"; } }}
5.好了,大功告成,我们看下效果
未登录状态下获取 GetMemberId ,返回 401
已登录状态下获取 GetMemberId , 返回 200
未登录状态下获取 GetMemberName , 返回 200
原标题:简单实现 Webapi 用户登录访问权限
关键词:web