在WEBAPI中,AuthorizeAttribute類重寫時,如何獲取post數據是個難題,網上找資料也不好使,只能自己研究,通過研究發現,WEBAPI給了我們獲取POST數據的可能,下麵介紹一下: //將POST數據以字元串的形式讀取,例如post的json數據,就可以以這種方式讀取 actio ...
在WEBAPI中,AuthorizeAttribute類重寫時,如何獲取post數據是個難題,網上找資料也不好使,只能自己研究,通過研究發現,WEBAPI給了我們獲取POST數據的可能,下麵介紹一下:
//將POST數據以字元串的形式讀取,例如post的json數據,就可以以這種方式讀取
actionContext.Request.Content.ReadAsStringAsync();
//將POST數據以內容流的形式讀取
actionContext.Request.Content.ReadAsStreamAsync();
//將POST數據以FORM鍵值對的形式讀取,但是提交的數據須得是FORM提交的才可以
actionContext.Request.Content.ReadAsFormDataAsync();
代碼具體如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Net.Http; 5 using System.Web; 6 using System.Web.Http; 7 using System.Web.Http.Controllers; 8 using BoxSecurity; 9 10 namespace BoxWebApiFilter 11 { 12 [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 13 public class ApiAuthorizeFilter : AuthorizeAttribute 14 { 15 private static List<string> PublicCmds = new List<string>() 16 { 17 "XXXX" 18 }; 19 protected override bool IsAuthorized(HttpActionContext actionContext) 20 { 21 // 驗證token 22 //var token = actionContext.Request.Headers.Authorization; 23 var ts = actionContext.Request.Headers.Where(c => c.Key.ToLower() == "tokenxxx").FirstOrDefault().Value; 24 var requestContent = actionContext.Request.Content.ReadAsStringAsync();//讀取post提交的json數據 25 requestContent.Wait();//等待非同步讀取結束 26 var inputJson = requestContent.Result; 27 //此介面無需token驗證 28 BoxCommand.CmdRequest request = 29 Newtonsoft.Json.JsonConvert.DeserializeObject<BoxCommand.CmdRequest>(inputJson); 30 if (PublicCmds.Contains(request.Cmd)) 31 { 32 return true; 33 } 34 35 if (ts != null && ts.Count() > 0) 36 { 37 var token = ts.First<string>(); 38 // 驗證token 39 return TokenHelper.IsExistToken(token); 40 } 41 42 if (actionContext.Request.Method == HttpMethod.Options) 43 return true; 44 return false; 45 46 } 47 } 48 }