Web|Web API身份认证解决方案之Basic基础认证
一、WebApi中为什么需要身份认证
我们在使用WebApi的时候,都是通过URL去获取数据。也就是说,任何人只要知道了URL地址,就能随意的访问后台的服务接口,就可以访问或者修改数据库数据了,这样就会导致很严重的后果。
1、我们不加身份认证,匿名用户可以直接通过url随意访问接口:
文章图片
2、增加了身份认证之后,只有带了票据的请求才能访问对应的接口。
文章图片
二、常见的认证方式
WebApi中常见的认证方式有如下几种:
- FORM身份验证
- 集成WINDOWS验证
- Basic基础认证
- Digest摘要认证
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未授权的错误。
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{/// /// 允许匿名登录/// /// /// 【Web|Web API身份认证解决方案之Basic基础认证】///[AllowAnonymous][HttpGet]public IHttpActionResult Login(string account,string password){ReturnValueEntity entity = new ReturnValueEntity(); // 真实生产环境中要去数据库校验account和passwordif (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){// 解密Ticketvar strTicket = FormsAuthentication.Decrypt(encryptTicket).UserData; // 从Ticket里面获取用户名和密码int index = strTicket.IndexOf("&"); //string strUser=strTicketstring[] array = strTicket.Split('&'); string strUser = array[0]; string strPwd = array[1]; // 真实生产环境中应该用解密的用户名和密码去数据库验证,这里为了演示方便// 假定用户名是Admin,密码是123456if(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|Web API中使用Autofac实现依赖注入
- #|【JavaWeb】Cookie和Session解析
- #|【JavaWeb】文件的上传和下载
- 基于FastAPI和Docker的机器学习模型部署快速上手
- 住手!你们不要再打了啦!Native和Web应该和平相处啊
- (六)React|(六)React Ant Design Pro + .Net5 WebApi(后端环境搭建-EF Core)
- 前端工程化(使用|前端工程化:使用 shelljs 生成 yapi 接口文件)
- android的js互调,如何在webView加载前给web传值
- ASP.NET|ASP.NET Core 简单集成签发 JWT (JSON Web Tokens)
- Spring Cloud Gateway 不小心换了个 Web 容器就不能用了,我 TM 人傻了