需要使用WEBAPI,但是有驗證問題沒解決.后來參考網上文章做了一下DEMO
思路:
就是根據用戶的賬號在服務端加密一個字符串,然后返回給用戶端.
具體:
- 用戶ID唯一身份標識,用戶密碼.首次登錄服務器.
- 服務端收到編號和密碼后,驗證登錄.如果成功則生成TOKEN
- 將用戶ID使用AES加密,放到數據庫.計下時間2小時過期.然后返回加密后的16位字符編碼(TOKEN)到客戶端.
- 客端請求接口時在header里帶上這個TOKEN.
- 服務端收到請求,驗證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) {}
});
