当前位置: 移动技术网 > IT编程>开发语言>c# > c# 自定义验证登录(Authorize)

c# 自定义验证登录(Authorize)

2019年07月30日  | 移动技术网IT编程  | 我要评论

我们的项目本来是用azure的auth认证,是用过程中发现登录速度太慢了,所以还是自己搞一个吧,没想到搞起来挺简单的,不是用一个专门的认证服务器哈,就是一个简单的工具类。

验证是否登录的类

    /// <summary>
    /// 认证类继承
    /// </summary>
    public class requestauthorizeattribute : authorizeattribute
    {
        public override void onauthorization(httpactioncontext actioncontext)
        {
            // 是否不需要验证 或者 已经登录
            if (skipauthorization(actioncontext) || islogin(actioncontext))
                return;

            actioncontext.response = getresponse();
        }

        /// <summary>
        /// 返回信息接口
        /// </summary>
        private httpresponsemessage getresponse()
        {
            var response = serviceresponse<bool>.warningresponse(401, commonconst.msg_nologin, false);
            return jsonhelper.tohttpresponsemessage(response);
        }

        /// <summary>
        /// 判断是否匿名使用接口
        /// </summary>
        private static bool skipauthorization(httpactioncontext actioncontext)
        {
            if (!actioncontext.actiondescriptor.getcustomattributes<allowanonymousattribute>().any<allowanonymousattribute>())
                return actioncontext.controllercontext.controllerdescriptor.getcustomattributes<allowanonymousattribute>().any<allowanonymousattribute>();
            return true;
        }

        /// <summary>
        /// 是否已经登录
        /// </summary>
        private bool islogin(httpactioncontext actioncontext)
        {
            var authorization = guid.empty.tostring(); // md5值
            if (actioncontext.request.headers.authorization != null)
            {
                authorization = actioncontext.request.headers.authorization.tostring();
            }

            var user = operatorprovider.provider.getcurrent(authorization);
            return user != null;
        }
    }

使用

登录接口数据缓存处理,获取到用户信息后,生成guid作为token,每次登录都会重新生成token,返回给请求来源,web端只保存token值即可,每次请求的时候把token放到header里面。

baseapicontroller处理,获取header里面的token值,把用户信息放到缓存里面,从缓存中获取后放到基类里面的model中,子类都可以使用用户信息。

    [requestauthorize]
    public class baseapicontroller : apicontroller
    {

        /// <summary>
        /// 当前用户信息实体
        /// </summary>
        public operatormodel currentusermodel
        {
            get
            {
                var values = httpcontext.current.request.headers.getvalues("authorization");
                var authorization=guid.empty.tostring();
                if (values != null && values.length > 0)
                    authorization = values[0];
                var currentusermodel = operatorprovider.provider.getcurrent(authorization);
                if (currentusermodel == null)
                {
                    currentusermodel = new operatormodel { loginname = "admin" };
                }
                return currentusermodel;
            }
        }
    }

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网