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) {}

  });


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM