WebApi身份认证解决方案:Basic基础认证下_第1页
WebApi身份认证解决方案:Basic基础认证下_第2页
WebApi身份认证解决方案:Basic基础认证下_第3页
WebApi身份认证解决方案:Basic基础认证下_第4页
WebApi身份认证解决方案:Basic基础认证下_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、WebApi身份认证解决方案(1): Basic基础认证(下)3、WebApiCORS 验证部分(重点)我们看到,上面的/Home/Index页面里面发送了 ajax请求去 访问服务的 HYPERLINK http:/localhost:27221/api/Charging/GetAllChargingData http:/localhost:27221/api/Charging/GetAllChargingData 这个接口,那么我们在 WebApi里面怎么去验证这个请求和 合法的请求呢?接下来我们重点看看验证的这个过程。在 WebApiCORS 项目里面自定义一个类 RequestAuth

2、orizeAttribute ,去继承我们的 AuthorizeAttribute 这个类。然后重写 OnAuthorization 方法, 在这个方法里面取到请求头的Ticket信息,然后校验用户名密码是否合理。/自定义此特性用于接口的身份验证/public class RequestAuthorizeAttribute : AuthorizeAttribute 重写基类的验证方式,加入我们自定义的Ticket验证public override voidOnAuthorization(System.Web. HYPERLINK http:/Http.Controllers.HttpActio

3、n Http.Controllers.HttpAction Context actionContext)从 http 请求的头里面获取身份验证信息,验证是否是请求发起方的ticketvar authorization =actionContext.Request.Headers.Authorization;if (authorization != null) & (authorization.Parameter != null)解密用户ticket,并校验用户名密码是否匹酉己var encryptTicket =authorization.Parameter;if(ValidateTicket

4、(encryptTicket)base.IsAuthorized(actionContext);elseHandleUnauthorizedRequest(actionContext);/如果取不到身份验证信息,并且不允许匿名访问,则返回未验证 401elsevar attributes =actionContext.ActionDescriptor.GetCustomAttributes().OfType();bool isAnonymous =attributes.Any(a = a is AllowAnonymousAttribute);if (isAnonymous) base.OnA

5、uthorization(actionContext);elseHandleUnauthorizedRequest(actionContext);校验用户名密码(正式环境中应该是数据库校验)private bool ValidateTicket(stringencryptTicket)解密 Ticket var strTicket =FormsAuthentication.Decrypt(encryptTicket).UserData;从Ticket里面获取用户名和密码var index strTicket.IndexOf(&);strTicket.Substring(0, index);st

6、rTicket.Substring(index + 1);admin & strPwd = 123456)return true;elsestring strUser =string strPwd = if (strUser =returnfalse;在具体的Api接口增加我们上面自定义类的特性RequestAuthorizeApiController /得到所有数据/返回数据string GetAllChargingData()Success;所有数据/据HttpGetHttpGetpublicreturn/得到当前Id的/参数Id/返回数public stringpublic class

7、ChargingController :GetAllChargingData(string id)return ChargingData + id;增加了特性标注之后,每次请求这个API里面的接口之前,程序会先进入到我们 override过的OnAuthorization() 方法里面,验证通过之后,才会进到相应的方法里面去执行,否则返回401 o四、优化通过上面的几步,基本就能达到我们想要的身份认证的效果,但是总是感觉不太方便,主要不太方便的点有以下几个。每次新建一个 API ,对应的接口上面都要标注RequestAuthorize这个一个东西,感觉好麻烦。每次发送ajax请求,都要在bef

8、oreSend事件里面加XHR.setRequestHeader( Authorization , BasicAuth +Ticket);这个,感觉也麻烦。如果有些 WebApi服务的莫些方法,我们不想使用这个验证,让它可以匿名用户验证(比如我们的登录方法Login )。该怎么处理呢。关于以上两点,我们优化下1、解决API的问题在API里面加一个公共的父类,在父类上面标注RequestAuthorize即可。namespaceWebApiCORS.Controllers RequestAuthorizeEnableCors(origins: *, headers: *, methods: *)

9、public class BaseApiController : ApiControllernamespace WebApiCORS.Controllerspublic classChargingController : BaseApiController/Ill得到所有数据IIIIII返回数据IIIIIIIII 参数 Idpublic stringHttpGetpublic string GetAllChargingData()return Success;III得到当前Id的所有数据III返回数据HttpGetGetAllChargingData(string id)return Char

10、gingData + id;注意:我们登录的请求是不需要验证的,因为登录的时候还没有产生票据,所以登录的 API不能够继承BaseApiController2、解决ajax的问题还记得我们在 JS组件系列一一圭装自己的JS组件,你也可以 这篇里面介绍的增加ajax的error事件的公共处理方法吗?我们是否也可以通过同样的机制去增加这个呢。新建一 个文件 Jquery_ajax_extention.js(function ($) II1.得至1J $.ajax 的对象 var _ajax =$.ajax; $.ajax = function (options) II2.每次调用发送ajax请求的

11、时候定义默认的error处理方法var fn = error: function (XMLHttpRequest,textStatus, errorThrown)toastr.error(XMLHttpRequest.responseText,错误消息, closeButton: true, timeOut: 0,positionClass: toast-top-full-width ); success: function (data, textStatus) , beforeSend: function (XHR) ,complete:function (XHR, TS) /3.扩展原生的

12、$.ajax方法,返回最新的参数var _options =$.extend(, error: function(XMLHttpRequest, textStatus, errorThrown) fn.error(XMLHttpRequest, textStatus,errorThrown);,success:function (data, textStatus) fn.success(data,textStatus);,beforeSend:function (XHR) XHR.setRequestHeader(Authorization, BasicAuth + Ticket);fn.be

13、foreSend(XHR);,complete: function (XHR, TS)plete(XHR,TS);, options);/4.将最新的参数传回ajax对象_ajax(_options); ;)(jQuery);引用这个js后再发送ajax不必在每个请求的beforeSend里面写了。3、解决特殊不想使用验证的方法如果我们莫些方法不想使用验证,使得它可以让匿名用户访问,我们可以在方法的上面加特性标注AllowAnonymous,申明该方法运行匿名访问。比如:public class ChargingController : BaseApiController public string GetAllChargingData(string id)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论