本文详细讲解了WebAPI身份认证解决方案之Basic基础认证,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 一、WebApi中为什么需要身份认证

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

1.我们不加身份认证。匿名用户可以通过url直接访问该界面:


2.添加身份验证后,只有带账单的请求才能访问相应的接口。


二、常见的认证方式

WebApi中常见的身份验证方法如下:

FORM身份验证集成WINDOWS验证Basic基础认证Digest摘要认证三、Basic基础认证Basic基础认证原理

身份验证的基本原理是加密用户信息以生成票证。每次请求后端API接口时,都会将生成的票证信息添加到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基础认证示例代码

假设我们想访问用户控制器的Get接口,接口方法返回一个int类型的列表集合。

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 { /// lt;summarygt; /// 允许匿名登录 /// lt;/summarygt; /// lt;param name="account"gt;lt;/paramgt; /// lt;param name="password"gt;lt;/paramgt; /// lt;returnsgt;lt;/returnsgt; [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 Jsonlt;ReturnValueEntitygt;(entity); } [HttpGet] public IHttpActionResult Get() { Listlt;intgt; list = new Listlt;intgt;(); list.Add(1); list.Add(2); list.Add(3); list.Add(4); list.Add(5); return Jsonlt;Listlt;intgt;gt;(list); } }}

在Login方法上添加[allowananonymous]属性,以指示允许匿名登录。

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{ /// lt;summarygt; /// 自定义特性继承自AuthorizeAttribute /// lt;/summarygt; public class BasicAuthorizeAttribute:AuthorizeAttribute { public override void OnAuthorization(HttpActionContext actionContext) { // 从当前http请求Request对象的头部信息里面获取Authorization属性 var authorization = actionContext.Request.Headers.Authorization; // 判断控制器获取action方法上面是否有AllowAnonymousAttribute特性,如果有,则允许匿名登录 if (actionContext.ActionDescriptor.GetCustomAttributeslt;AllowAnonymousAttributegt;(true).Count != 0 || actionContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributeslt;AllowAnonymousAttributegt;(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); } } /// lt;summarygt; /// 验证Ticket信息 /// lt;/summarygt; /// lt;param name="encryptTicket"gt;lt;/paramgt; /// lt;returnsgt;lt;/returnsgt; 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、前端代码lt;!DOCTYPE htmlgt;lt;html lang="en"gt;lt;headgt; lt;meta charset="UTF-8"gt; lt;meta name="viewport" content="width=device-width, initial-scale=1.0"gt; lt;meta http-equiv="X-UA-Compatible" content="ie=edge"gt; lt;titlegt;权限认证lt;/titlegt; lt;script src="jquery-1.10.2.min.js"gt;lt;/scriptgt; lt;scriptgt; // 定义全局的ticket变量,用来保存登录成功以后的Ticket值 var ticket; window.onload=function(){ }; function Login(){ $.ajax({ url:"http://localhost:20033/api/usersaccount="+$("#acc").val().trim()+"password="+$("#pwd").val().trim(), type:"Get", dataType:"json", "headers": { "Content-Type": "application/json", "cache-control": "no-cache" }, success:function(data){ if(result.Result){ ticket=data.Ticket; }else{ alert("失败"); } }, error:function(data){ alert(data); } }); }; function Test(){ alert(ticket); $.ajax({ url:'http://localhost:20033/api/users', type:"Get", dataType:"json", beforeSend:function(XHR){ //发送ajax请求之前向http的head里面加入验证信息 XHR.setRequestHeader('Authorization','BasicAuth '+ticket); }, success:function(data){ alert(data); }, error:function(data){ alert(data); } }); }; lt;/scriptgt;lt;/headgt; lt;bodygt; lt;divgt; lt;divgt; lt;labelgt;用户名:lt;/labelgt; lt;input type="text" id="acc"gt; lt;/divgt; lt;divgt; lt;labelgt;密码:lt;/labelgt; lt;input type="password" id="pwd"gt; lt;/divgt; lt;divgt; lt;input type="button" id="btnLogin" onclick="Login()" value="登录"gt; lt;/divgt; lt;divgt; lt;input type="button" id="GetAccount" onclick="Test()" value="测试"gt; lt;/divgt; lt;/divgt;lt;/bodygt;lt;/htmlgt;

这里需要说明的是,在发送ajax请求之前,我们使用xhr . setrequestheader(# 39;授权# 39;, #39;BasicAuth # 39+票);将票证信息添加到这个http请求的头部。

通过以上步骤,可以达到基础认证的效果。

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

4、优化

添加每个控制器时,需要将[BasicAuthorize]功能添加到相应的控制器中。可以定义一个通用的控制器父类,它继承自ApiController,然后其他控制器继承父类。

就是这样。这篇关于Web API认证解决方案的基本认证的文章就是在这里介绍的。希望对大家的学习有所帮助