三 Web API 受權方式android
web api的客戶端,包括 android,ios,h5,天然對訪問權限要加上受權機制。對於h5,要求把h5站點和web api部署在同一個域名下,而後對web api 配置爲禁止跨域訪問。而對 android 和 ios 等app端訪問,則參考微信的簽名驗證方式,在請求url後面加上ios
時間戳,隨機字符串,以及加密後的簽名。下面主要就app端受權實現代碼說明一下。web
1 首先 定義一個 KEY,隨便本身定義,我這裏直接取一個guid,你能夠存放在數據庫,也能夠存config文件,也能夠直接在代碼裏 const定義。我這裏放在config。數據庫
<appSettings> <add key="AppKey" value="254d-4eaa-85f4-a92ff4c08042" /> </appSettings>
2 實現一個特性類,繼承自.net自帶的AuthorizationFilterAttribute。api
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] public class ApiAuthFilterAttribute : AuthorizationFilterAttribute { 。。。。 }
AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)的意思 很容易理解,即當前訪問受權驗證能夠用在整個controller(class),也能夠用在某個web api(method)上。
這個類裏面,重點是重載 OnAuthorization方法。方法裏的actionContext參數是一個微軟針對api請求的作了一些封裝改進的一個請求上下文,裏面包含了api 請求參數等信息,惋惜缺少我想要的header裏的參數。
咱們和app端約定把受權相關參數放在header裏面,還有後面一些有關api版本的參數等都放在header裏,放在header裏安全性更高一些,並且對於app端封裝http請求也更簡單。爲了從actionContext獲得普通的HttpContext對象,
轉換代碼:HttpRequestBase request = (actionContext.Request.Properties["MS_HttpContext"] as HttpContextBase).Request;
public override void OnAuthorization(HttpActionContext actionContext) { base.OnAuthorization(actionContext); // 容許匿名訪問 if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Count > 0) { return; } HttpRequestBase request = (actionContext.Request.Properties["MS_HttpContext"] as HttpContextBase).Request;
拿到了request,能夠經過跨域
string signature = request.Headers["signature"]; string timestamp = request.Headers["timestamp"];
string nonce = request.Headers["nonce"];
result = CheckSignature(signature, timestamp, nonce);
進行受權驗證安全
對於須要進行受權的web api
[HttpGet] [ApiAuthFilter] public ApiResult GetShopQRCodeList() { 。。。 }
3 對於用戶身份識別,咱們使用了token機制。即用戶登陸成功後分配一個token(採用guid)給到客戶端。當客戶端在請求的header裏攜帶了token時,咱們就能夠根據token識別當前請求的用戶。在數據庫裏設計了token表,記錄用戶登陸時間,登陸設備(h5,app,微信公衆號等),token值等,至關於cookie,用於控制用戶免密碼登陸,以及能夠同時登陸幾種設備等。微信