• web api简单验证实现办法


     需要使用WEBAPI,但是有验证问题没解决.后来参考网上文章做了一下DEMO

    思路:

      就是根据用户的账号在服务端加密一个字符串,然后返回给用户端.

    具体:

    1. 用户ID唯一身份标识,用户密码.首次登录服务器.
    2. 服务端收到编号和密码后,验证登录.如果成功则生成TOKEN
    3. 将用户ID使用AES加密,放到数据库.计下时间2小时过期.然后返回加密后的16位字符编码(TOKEN)到客户端.
    4. 客端请求接口时在header里带上这个TOKEN.
    5. 服务端收到请求,验证TOKEN:是否存在,是否过期,解密后比对用户编号等等.

    实现:

      使用了AuthorizeAttribute特性,实现了它的部分方法完成验证步骤.然后再webapi控制器的方法上贴上这个标记.

      这个类实现WEBAPI的验证特性.贴上这个特性之后,就会验证授权.在MVC里也有同样的东西.但是它们不在同一个命名空间.WEB API 是这个空间System.Web.Http
      参考地址
        https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(System.Web.Http.AuthorizeAttribute);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5);k(DevLang-csharp)&rd=true
      参考实现代码地址
      http://www.cnblogs.com/landeanfen/archive/2016/03/24/5287064.html

    关键代码和细节:

      

    // 实现这个特性,并且重写几个方法
    public class ApiAuthorize: AuthorizeAttribute
    {
         // 操作授权时会调用此方法,这是完成验证的关键方法
        public override void OnAuthorization(HttpActionContext actionContext)
        {
                /*
                 * Authorization 这个属性有值,是因为客户端传来了.而且传参的格式如下:
                 * 'Authorization':'Basic token',键就是属性名字.值要加上Basic前缀,即"http基本验证"
                 */
                // 获取请求头里的验证信息
                var authorization = actionContext.Request.Headers.Authorization;
                // 如果有,且参数也有.说明可能验证过的
                if ((authorization != null) && (authorization.Parameter != null))
                {
                    // 校验用户名密码是否匹配
                    string encryptTicket = authorization.Parameter;
                    // 成功则调用基类的验证是否登录方法 
                    if (ValidateTicket(encryptTicket))
                    {
                        base.IsAuthorized(actionContext);
                    }
                    else 
                    {
                        // 失败则调用失败时处理方法 
                        HandleUnauthorizedRequest(actionContext);
                    }
                }
                //如果取不到身份验证信息,调用失败请求处理方法
                else
                {
                    HandleUnauthorizedRequest(actionContext);
                }
        }      
        // 这个方法 会在验证失败时调用,可以设定返回状态值和返回信息.
        protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
            {
                base.HandleUnauthorizedRequest(actionContext);
                var response = actionContext.Response = actionContext.Response ?? new System.Net.Http.HttpResponseMessage();
                // 这句话可以改变请求状态值 就是 200 403 之类的那个状态值
                response.StatusCode = System.Net.HttpStatusCode.OK;
                // 将这个出错信息加入到返回对象中.
                response.Content = new System.Net.Http.StringContent
    (System.Web.Helpers.Json.Encode(new { status = "1", msg = "身份验证出错!"}), System.Text.Encoding.UTF8, "application/json"); } // 这个方法验证TOKEN的有效性 private bool ValidateTicket(string token) { // 目前实现办法是,将每次请求的用户编号,token信息放到数据库中. // 每登录一次,记录当时的用户编号,GUID,密钥,生成时间,过期时间,TOKEN. // 然后每次请求接口时,查询这些数据,成功则表示通过验证 } }

    调用:

      在api控制器上贴上这个标记

      [ApiAuthorize]
      public object Get()

      {return new { status = "1", msg = "你已经通过验证", data = new { a = 1, b = 2, c = 3 } };}

      // 向这个API发请求,(JQUERY版本是jquery-1.10.2.min.js)

          var token="eufjd93j49013jlk21jK9dfj13j32932jjdfk92130123j13jeqpwe123fdjsde3";

      $.ajax({
          type: "GET",

          url: "/api/get",

          headers: { 'Authorization':'Basic '+ token).val() },// 这里要加上Basic前缀.表示"http基本身份验证",不然,服务端接的authorization.Parameter参数始终是NULL

          dataType: 'json',

          success: function (result) {}

      });

  • 相关阅读:
    华为实习日记——第二十三天
    华为实习日记——第二十二天
    华为实习日记——第二十一天
    华为实习日记——第二十天
    HDU 5102 The K-th Distance(模拟)
    HDU 4113 Construct the Great Wall(插头dp)
    UVALive 4849 String Phone(2-sat、01染色)
    HDU 4859 海岸线(最大流最小割)
    HDU 3879 Base Station(最大权闭合子图)
    POJ 3155 Hard Life(最大密度子图)
  • 原文地址:https://www.cnblogs.com/mirrortom/p/5931352.html
Copyright © 2020-2023  润新知