Asp.Net WebApi 请求Token验证
WebAPI主要开放数据给手机APP,Pad,或其他需要请求数据的系统及应用软件。Web用户的身份验证,及页面操作权限验证是B/S系统的基础功能。
新建一个AuthToken.cs,继承AuthorizeAttribute重写基类的验证方式,重写HandleUnauthorizedRequest。示例中提供了两种验证方式
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Text; using System.Web.Helpers; using System.Web.Http; using System.Configuration; namespace Project.Example.WebApi.Filters { /// <summary> /// 全局验证token /// </summary> [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)] public class AuthToken : AuthorizeAttribute { /// <summary> /// 重写基类的验证方式,加入我们自定义的Ticket验证 /// </summary> /// <param name="actionContext"></param> public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) { if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Count() > 0) return; //var host = actionContext.Request.Headers.Host; ////方式一 //var authorization = actionContext.Request.Headers.Authorization; //if (authorization == null) //{ // ResponseErrorMsg(actionContext, "无效身份,请设置Authorization请求头"); // return; //} //if (!authorization.Scheme.Equals("Bearer")) //{ // ResponseErrorMsg(actionContext, "无效身份,请确保Authorization请求头值中以Bearer开头,格式:“Bearer KLeZicALNZcTK5cOmYkoQ7yHgegeeNEH5Btg1hGoM+XtP”"); // return; //} //string authkey = authorization.Parameter; //方式二 //获取token(请求头里面的值) var authkey = System.Web.HttpContext.Current.Request.Headers["authkey"] ?? ""; if (!string.IsNullOrEmpty(authkey)) { //校验授权码是否正确 string Secret = ConfigurationManager.AppSettings["ClientSecret"]; if (Secret == authkey) base.IsAuthorized(actionContext); else //ResponseErrorMsg(actionContext, "Authorization请求头值不正确"); ResponseErrorMsg(actionContext, "header中指定的authKey值不正确"); //var host = actionContext.Request.RequestUri.Host; //var controllerName = actionContext.ControllerContext.ControllerDescriptor.ControllerName; //var actionName = actionContext.ActionDescriptor.ActionName; } else { //如果取不到authkey信息,并且不允许匿名访问,则返回未验证401 var anonymousAttributes = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().OfType<AllowAnonymousAttribute>(); if (anonymousAttributes.Count() == 0) { ResponseErrorMsg(actionContext, "header中必须指定authKey"); } else { base.OnAuthorization(actionContext); } } } /// <summary> /// ResponseErrorMsg /// </summary> /// <param name="filterContext"></param> /// <param name="errorMsg"></param> protected void ResponseErrorMsg(System.Web.Http.Controllers.HttpActionContext filterContext, string errorMsg) { var response = filterContext.Response = filterContext.Response ?? new HttpResponseMessage(); response.StatusCode = HttpStatusCode.Forbidden; var content = new { Success = false, Msg = errorMsg }; response.Content = new StringContent(Json.Encode(content), Encoding.UTF8, "application/json"); } } }
总结
1、总体思路,如果是合法的Http请求,在Http请求头中会有用户身份的票据信息,服务端会读取票据信息,并校验票据信息是否完整有效,如果满足校验要求,则进行业务数据的处理,并返回给请求发起方;
2、如果没有票据信息,或者票据信息不是合法的,则返回“未授权的访问”异常消息给前端,由前端处理此异常。
3、登录的时候判断用户名跟密码对不对,对了就生成用户信息的Token,Session保存一个Token,BaseApiController里面的登录名跟Token也赋值了。保存这些票据信息。
4、当用户有权限操作页面或页面元素时,跳转到页面,并由页面Controller提交业务数据处理请求到api服务器; 如果用户没有权限访问该页面或页面元素时,则显示“未授权的访问操作”,跳转到系统异常处理页面。
5、 api业务服务处理业务逻辑,并将结果以Json 数据返回,返回渲染后的页面给浏览器前端,并呈现业务数据到页面;

浙公网安备 33010602011771号