2017年1月16日 星期一

SIMPLE ASP.NET Web API with Basic Auth

新增一個 Visual Studio Web MVC 的專案
選擇 WEB API

打開 Controller 會看到Controller,我們使用 Values來做修改


修改 ValuesController 如下,不用資料庫取存,只要 Http 的部分可以運作,資料庫存取 is nothing。
using System;
using System.Collections.Generic;
using System.Web.Http;

namespace MvcApplication1.Controllers
{
    public class ValuesController : ApiController
    {
        private List userList;

        public ValuesController()
        {
            userList = new List();
            userList.Add(new Models.User()
            {
                Id = 1,
                Name = "Jerry"
            });

            userList.Add(new Models.User()
            {
                Id = 2,
                Name = "Tom"
            });
        }

        public IEnumerable Get()
        {
            return userList;
        }
    }
}

接下來,新增一個自訂類別:BasicAuthenticationAttribute,建立驗證 Basic Authentication
using System;
using System.Collections.Generic;
using System.Web.Http.Filters;
using System.Net.Http;
using System.Security.Principal;

namespace MvcApplication1
{
    public class BasicAuthenticationAttribute : AuthorizationFilterAttribute
    {
        public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            base.OnAuthorization(actionContext);

            if (actionContext.Request.Headers.Authorization == null)
            {
                actionContext.Response = 
                     actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Unauthorized);
            }
            else
            {
                string token = actionContext.Request.Headers.Authorization.Parameter;
                string decode = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(token));
                string[] value = decode.Split(':');
                string id = value[0];
                string pwd = value[1];

                if (id == "jerry" && pwd == "123")
                {
                    System.Threading.Thread.CurrentPrincipal = 
                         new GenericPrincipal(new GenericIdentity(id), null);
                }
                else
                {
                    actionContext.Response = 
                         actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Unauthorized);
                }

            }
        }
    }
}

Controller 必須套用這個自訂類別
    [BasicAuthentication]
    public class ValuesController : ApiController{...}

趕快來測試一下 Web Api 是否可以運作,使用 Chrome 安裝 POSTMAN 的外掛 https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=zh-TW

點選 POSTMAN 會出現帳號登入,可以 SKIP。進入 POSTMAN 前請將 VISUAL STUDIO 啟用 DEBUG 模式,將網址貼至 POSTMAN,點選 Authorization,Type 選 Basic Auth,輸入帳:jerry,密:123,設定完成請點選橘色按鈕 Update Request。

之後按下藍色按鈕 Send,看到資料回來了,我們打完收工先去開一場 lol再回來。

打完lol了,回來看看注意事項,網址 http://localhost:1056/api/Values,
不能用 http://localhost:1056/api/Values/Get,使用Get 需要加參數。
再來就是網址貼到 Chrome 執行http://localhost:1056/api/Values,會是空白頁!
因為網址存需時沒有傳送 Basic Auth 的資訊,才會出現 401 Unauthorized 未驗證(因為Controller套用了[BasicAuthentication]),測試正常!

另外,Web Api 的專案預設是傳回 xml,網上有不少人討論這個問題,
這篇文章的範例來說,拿掉 Controller 上面的[BasicAuthentication] 使用 IE 執行網址會下載一個 .json 檔案,
在 chrome 執行網址會變成 xml 格式,
在地球上最具權威的IT論壇上有多種解法, http://stackoverflow.com/questions/9847564/how-do-i-get-asp-net-web-api-to-return-json-instead-of-xml-using-chrome, 裡面有位 Yakir Manor的解法較簡單。
這文章發問區塊有個Natan提供了ASP.NET MVC GITHUB 連結,GITHUB 上有人建議 Consider only adding the JSON formatter by default,
意思就是預設改為 JSON 的格式!
https://github.com/aspnet/Mvc/issues/1765
良心建議各位查詢資料以英文為主,留下技術文章不是為了得到 MS MVP,不是為了要申請MVP 要資料審查,而是留下進步的過程!有沒有 MVP 的差別是什麼?MVP 滿足了你的什麼?笑傲江湖:「人在江湖,名聲和信譽不是哪門哪派給你的,憑的是你心中的信念」

藏招文化在台灣IT 業屢見不鮮,看著那些學 WEB FORM 的人認為自己所學是真正的尖端技術,卻不知道自己做出來的網站有著 CONNECTION POOL 超過限制的問題,
緊緊抓著自己僅有的技術不放,而錯過不斷進步的機會!
小弟勸各位把技術分享給別人,自己不斷學習新的技術,這才是上上策!

沒有留言: