WebAPI的AuthorizeAttribute擴充套件類中獲取POST提交的資料
阿新 • • 發佈:2019-02-16
在WEBAPI中,AuthorizeAttribute類重寫時,如何獲取post資料是個難題,網上找資料也不好使,只能自己研究,通過研究發現,WEBAPI給了我們獲取POST資料的可能,下面介紹一下:
//將POST資料以字串的形式讀取,例如post的json資料,就可以以這種方式讀取
actionContext.Request.Content.ReadAsStringAsync();
//將POST資料以內容流的形式讀取
actionContext.Request.Content.ReadAsStreamAsync();
//將POST資料以FORM鍵值對的形式讀取,但是提交的資料須得是FORM提交的才可以
actionContext.Request.Content.ReadAsFormDataAsync();
程式碼具體如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using System.Web.Http.Controllers;
using BoxSecurity;
namespace BoxWebApiFilter
{
[AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false , Inherited = true)]
public class ApiAuthorizeFilter : AuthorizeAttribute
{
private static List<string> PublicCmds = new List<string>()
{
"XXXX"
};
protected override bool IsAuthorized(HttpActionContext actionContext)
{
// 驗證token
//var token = actionContext.Request.Headers.Authorization;
var ts = actionContext.Request.Headers.Where(c => c.Key.ToLower() == "tokenxxx").FirstOrDefault().Value;
var requestContent = actionContext.Request.Content.ReadAsStringAsync();//讀取post提交的json資料
requestContent.Wait();//等待非同步讀取結束
var inputJson = requestContent.Result;
//此介面無需token驗證
BoxCommand.CmdRequest request =
Newtonsoft.Json.JsonConvert.DeserializeObject<BoxCommand.CmdRequest>(inputJson);
if (PublicCmds.Contains(request.Cmd))
{
return true;
}
if (ts != null && ts.Count() > 0)
{
var token = ts.First<string>();
// 驗證token
return TokenHelper.IsExistToken(token);
}
if (actionContext.Request.Method == HttpMethod.Options)
return true;
return false;
}
}
}