你的位置:首页 > ASP.net教程

[ASP.net教程]简单实现 Webapi 用户登录访问权限


总结一下上一个项目中对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