码迷,mamicode.com
首页 > Windows程序 > 详细

简单实现 Webapi 用户登录访问权限

时间:2016-06-14 13:54:34      阅读:5295      评论:0      收藏:0      [点我收藏+]

标签:

总结一下上一个项目中对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 用户登录访问权限

标签:

原文地址:http://www.cnblogs.com/simendancer/p/5583580.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!