1、Http基本認證只需要添加新的認證過濾屬性。該屬性類繼承自 System.Web.Http.AuthorizeAttribute,在 IsAuthorized(...)方法中讀取Http 頭部Authorization字段及其值,進行自定義驗證。
1 public class HttpBasicAuthAttribute : System.Web.Http.AuthorizeAttribute 2 { 3 public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) 4 { 5 //從http請求的頭里面獲取身份驗證信息,驗證是否是請求發起方的ticket 6 var authorization = actionContext.Request.Headers.Authorization; 7 if ((authorization != null) && (authorization.Parameter != null)) 8 { 9 //解密用戶ticket,並校驗用戶名密碼是否匹配 10 var encryptTicket = authorization.Parameter; 11 if (ValidateTicket(encryptTicket)) 12 { 13 base.IsAuthorized(actionContext); 14 } 15 else 16 { 17 HandleUnauthorizedRequest(actionContext); 18 } 19 } 20 //如果取不到身份驗證信息,則返回未驗證401 21 else 22 { 23 HandleUnauthorizedRequest(actionContext); 24 } 25 } 26 27 //校驗用戶名密碼(正式環境中應該是數據庫校驗) 28 private bool ValidateTicket(string encryptTicket) 29 { 30 //解密Ticket 31 string strTicket = System.Text.Encoding.Default.GetString(Convert.FromBase64String(encryptTicket)); 32 33 //從Ticket里面獲取用戶名和密碼 34 var index = strTicket.IndexOf(":"); 35 string strUser = strTicket.Substring(0, index); 36 string strPwd = strTicket.Substring(index + 1); 37 38 if (strUser == "admin" && strPwd == "123456") 39 { 40 return true; 41 } 42 else 43 { 44 return false; 45 } 46 } 47 }
2、在需要驗證的具體Controller類或封裝的基類中添加HttpBasicAuthAttribute類屬性。
1 [HttpBasicAuth] 2 public class BaseController : ApiController 3 { 4 private string _adminUserToken = ""; 5 6 /// <summary> 7 /// Admin User Token 8 /// </summary> 9 public string AdminUserToken 10 { 11 get { return _adminUserToken; } 12 set { _adminUserToken = value; } 13 } 14 }
3、這樣就完成了服務器端的設置。
4、用Postman調用:
5、Asp.net調用:
1 string Username = "admin"; 2 string Password = "123456"; 3 using (HttpClient client = new HttpClient()) 4 { 5 client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{Username}:{Password}"))); 6 7 HttpContent httpContent = new StringContent("", Encoding.UTF8); 8 httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 9 Uri address = new Uri("https://xxx/api/issues"); 10 11 var response = client.PostAsync(address, httpContent).Result.Content.ReadAsStringAsync().Result;//返回值 12 }
6、返回結果:
【原文出處】http://www.51aras.com/?id=39