FormsAuthentication认证

方式A

前端代码

    <script type="text/javascript">
        var ticket = "secret";
        $.ajax({
            url: "/api/default/getuserbyname",
            type: "GET",
            dataType:"json",
            data: { "username": "first" },
            beforeSend: function (xhr) {
                // 添加请求头信息
                xhr.setRequestHeader('Authorization','BasicAuth'+ ticket);
            },
            success: function (data) {
                alert(JSON.stringify(data));
            }
             
        });
    </script>

自定义特性

    public class AllowAnonymousAttribute:Attribute
    {
    }
    public class BasicAuthorizeAttribute:AuthorizeAttribute
    {
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            
            if(actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().FirstOrDefault()!= null)
            {
                return;
            }
            if(actionContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().FirstOrDefault()!= null)
            {
                return;
            }
            var authorization = actionContext.Request.Headers.Authorization;
            if(authorization == null)
            {
                this.HandleUnAuthorization();
            } else if(this.ValidateTickte(authorization.Parameter))
            {

            } else
            {
                this.HandleUnAuthorization();
            }
        }
        private void HandleUnAuthorization()
        {

        }

        private bool ValidateTickte(string encryptTicket)
        {
            try
            {
                if(string.IsNullOrWhiteSpace(encryptTicket))
                {
                    return false;
                }
                var strTicket = FormsAuthentication.Decrypt(encryptTicket).UserData;
                return string.Equals(strTicket,string.Format("{0}&{1}","Admin","123456"));
            }
            catch (Exception)
            {
                return false;
            }
        }
    }

控制器

    public class DefaultController : ApiController
    {
        private List<User> _userList = new List<User>
        {
            new User {UserID = 1, UserName = "first", UserEmail = "first@qq.com"},
            new User {UserID = 2, UserName = "second", UserEmail = "second@qq.com"},
            new User {UserID = 3, UserName = "third", UserEmail = "third@qq.com"}
        };

        [HttpGet]
        [BasicAuthorize]
        public IEnumerable<User> GetUserByname(string username)
        {
            string userParameterName = HttpContext.Current.Request.QueryString["username"];
            return _userList.Where(p=> string.Equals(p.UserName,userParameterName,StringComparison.OrdinalIgnoreCase));
        }
    }
    public class User
    {
        public int UserID { get; set; }
        public string UserName { get; set; }
        public string UserEmail { get; set; }
    }

 方式二

前端代码

    <script type="text/javascript">
        var user = { UserID: "1", UserName: "first", UserEmail: "first@qq.com" };
        $.ajax({
            url: "/api/default/Login",
            type: "get",
            dataType: "json",
            data: { "account": "admin", "password": "123" },
            success: function (data) {
                var result = JSON.parse(data);
                if (result.Result) {
                    ticket = result.Ticket;
                    alert(result.Ticket);
                }
                else {
                    alert("failed");
                }
            }
        });
    </script>

后台代码

        [HttpGet]
        public string Login(string account, string password)
        {
            FormsAuthenticationTicket formsAuthenticationTicket = new FormsAuthenticationTicket(0, account, DateTime.Now, DateTime.Now.AddHours(1), true, string.Format("{0}&{1}", account, password), FormsAuthentication.FormsCookiePath);
            var result = new
            {
                Result = true,
                Ticket = FormsAuthentication.Encrypt(formsAuthenticationTicket)
            };
            return JsonConvert.SerializeObject(result);
        }

 

posted @ 2020-03-16 19:29  bradleydan  阅读(90)  评论(0)    收藏  举报