千家信息网

Web API如何实现Basic基础认证

发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,这篇文章主要介绍了Web API如何实现Basic基础认证的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Web API如何实现Basic基础认证文章都会有所收获,下面我们
千家信息网最后更新 2024年11月22日Web API如何实现Basic基础认证

这篇文章主要介绍了Web API如何实现Basic基础认证的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Web API如何实现Basic基础认证文章都会有所收获,下面我们一起来看看吧。

一、WebApi中为什么需要身份认证

我们在使用WebApi的时候,都是通过URL去获取数据。也就是说,任何人只要知道了URL地址,就能随意的访问后台的服务接口,就可以访问或者修改数据库数据了,这样就会导致很严重的后果。

1、我们不加身份认证,匿名用户可以直接通过url随意访问接口:

2、增加了身份认证之后,只有带了票据的请求才能访问对应的接口。

二、常见的认证方式

WebApi中常见的认证方式有如下几种:

  • FORM身份验证

  • 集成WINDOWS验证

  • Basic基础认证

  • Digest摘要认证

三、Basic基础认证

Basic基础认证原理

Basic认证的基本原理就是加密用户信息生成Ticket,每次请求后端API接口的时候把生成的Ticket信息加到http请求的头部传给后端进行验证。具体步骤如下:

  • 1、登录的时候验证用户名和密码,如果验证通过,则将用户名和密码按照一定的规则生成加密后的票据信息Ticket,然后将Ticket传递到前端。

  • 2、如果登录成功,前端定义一个全局的变量接收API接口返回的Ticket信息。

  • 3、前端界面再次发起ajax请求后端API接口的时候,将Ticket信息加入到HTTP请求的Head里面,将Ticket信息随着http请求一起发送到后端API接口。

  • 4、在后端的WebApi服务中定义一个类,该类继承自AuthorizeAttribute类,然后重新父类里面的OnAuthorization方法,在OnAuthorization方法里面,通过actionContext参数取得http请求的Head,从Head里面可以获取前端传递过来的Ticket信息。将Ticket解密得到用户名和密码,然后验证用户名和密码是否正确。如果正确,表示验证通过。如果不正确,则返回401未授权的错误。

四、Basic基础认证示例代码

假设我们要访问Users控制器的Get接口,该接口方法返回int类型的List集合。

1、登录的API接口

using Newtonsoft.Json;using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Http;using System.Web.Http;using System.Web.Security;using WebApiBasicAuthorize.CustomerAttribute;using WebApiBasicAuthorize.Entity;namespace WebApiBasicAuthorize.Controllers{    [BasicAuthorize]    public class UsersController : ApiController    {        ///         /// 允许匿名登录        ///         ///         ///         ///         [AllowAnonymous]        [HttpGet]        public IHttpActionResult Login(string account,string password)        {            ReturnValueEntity entity = new ReturnValueEntity();            // 真实生产环境中要去数据库校验account和password            if (account.ToUpper().Trim().Equals("ADMIN") && password.Trim().Equals("123456"))            {                FormsAuthenticationTicket ticket = 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(ticket) };                entity.Result = true;                entity.Ticket = FormsAuthentication.Encrypt(ticket);            }            else            {                entity.Result = false;                entity.Ticket = "";            }            return Json(entity);        }        [HttpGet]        public IHttpActionResult Get()        {            List list = new List();            list.Add(1);            list.Add(2);            list.Add(3);            list.Add(4);            list.Add(5);            return Json>(list);        }    }}

在Login方法上面添加 [AllowAnonymous]特性,表示允许匿名登录。

2、基础认证接口

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Http;using System.Web.Http.Controllers;using System.Web.Security;namespace WebApiBasicAuthorize.CustomerAttribute{    ///     ///  自定义特性继承自AuthorizeAttribute    ///     public class BasicAuthorizeAttribute:AuthorizeAttribute    {        public override void OnAuthorization(HttpActionContext actionContext)        {            // 从当前http请求Request对象的头部信息里面获取Authorization属性            var authorization = actionContext.Request.Headers.Authorization;            // 判断控制器获取action方法上面是否有AllowAnonymousAttribute特性,如果有,则允许匿名登录            if (actionContext.ActionDescriptor.GetCustomAttributes(true).Count != 0                || actionContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(true).Count != 0)            {                base.OnAuthorization(actionContext);            }            else if (authorization != null && authorization.Parameter != null)            {                // 验证用户逻辑                if (ValidateTicket(authorization.Parameter))                {                    // 验证通过                    base.IsAuthorized(actionContext);                }                else                {                    this.HandleUnauthorizedRequest(actionContext);                }            }            else            {                // 返回401没有授权的状态码                this.HandleUnauthorizedRequest(actionContext);            }        }        ///         /// 验证Ticket信息        ///         ///         ///         private bool ValidateTicket(string encryptTicket)        {            // 解密Ticket            var strTicket = FormsAuthentication.Decrypt(encryptTicket).UserData;            // 从Ticket里面获取用户名和密码            int index = strTicket.IndexOf("&");            //string strUser=strTicket            string[] array = strTicket.Split('&');            string strUser = array[0];            string strPwd = array[1];            // 真实生产环境中应该用解密的用户名和密码去数据库验证,这里为了演示方便            // 假定用户名是Admin,密码是123456            if(strUser.Equals("Admin")&&strPwd.Equals("123456"))            {                return true;            }            else            {                return false;            }                   }    }}

3、前端代码

                权限认证             

这里需要说明的是,我们在发送ajax请求之前,通过XHR.setRequestHeader('Authorization', 'BasicAuth ' + Ticket); 这句向http请求的Head里面添加Ticket信息。

通过上面的几步就可以达到Basic认证的效果了。

注意:后端的WebApi接口要配置允许跨域访问。

4、优化

每增加一个控制器,都需要在相应的控制器上面加[BasicAuthorize]特性,可以定义一个公共的控制器父类,该父类继承自ApiController,然后其他控制器继承该父类。

关于"Web API如何实现Basic基础认证"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"Web API如何实现Basic基础认证"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

0