Net MVC構造APIインターフェースにおいて、httpヘッダ情報が共通の権限検証フィルタを実現すると判定された例
4077 ワード
//control action
User-Agent:FiddlerHost:localhostContntntint Length:478 Contentt Type:tex/ jsonMySecurityKey:roxnQNJLa0 voulFXMcGGGGGGGGGGGGGGGGGGGGGGGGGGJJJJJTTTJJJJJJJJJT1 nJJJJJJJJJJJJJTTT1 nJJJJJJJJJJJJJJJJJJJJJJJJJTTT1 HmBBBBBBBBtDV1 HmmBBBBBBBBBBumumFFFFFFFF3 AuYcEN%2 F 9873 lIjxyuK%2 FUQ 75 vJ 3 kH 3 bYIZykRmSvR 4 fPMbxNVHuhO%2 BdVJQDpLS 2 KbjffkMNYBJJJJJWPJ%2 FLzCIesaLh%2 CFDJJPJJJJJJJJJJJJJJJpJ 9 WJ7 ahN%2 Fj%2 BkmWNJYBxPPVO 3 IU%3 D
手に入れました MySecurityKeyの値は、どのように処理すればいいですか?私のところは同じ例です。効果的にapiの安全係数を増加します。どの方法が重要かというと、権限を使うには、上に[
MyAuthFilterラベルは、権限検証を実現することができます。もちろん、異なる方法であれば、異なるトランシーバーを使用することもできます。自分で勝手に定義できます。
public class TestController : ApiController
{
[MyAuthFilter]
public string test(string str)
{
return str.Trim();
}
}
//
public class MyAuthFilter : ActionFilterAttribute
{
const string SecurityKeyName = "MySecurityKey";//http name
public object _EBACLS = new object();
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (EBPermission == "1")//
{
if (EBACLS == null)
{
lock (_EBACLS)
{
EBACLS = SetEBACLSData();
}
}
bool isAuth = false;
bool isPermission = false;
EBSecurityData EBSecurityData = null;//
IEnumerable<string> lists;
if (actionContext.Request.Headers.TryGetValues(SecurityKeyName, out lists))
{
string securityKey = lists.FirstOrDefault();
LogUtility.WriteLog(SecurityKeyName + securityKey);//
try
{
EBSecurityData = EBSecurityUtility.GetSecurityData(securityKey);//
LogUtility.WriteLog("EBSecurityData:" + (EBSecurityData != null ? EBSecurityData.ObjectToJson() : ""));
}
catch (Exception)
{ }
if (EBSecurityData != null && EBSecurityData.Expire > DateTime.Now && EBSecurityData.ProviderId > 0)
{
GenericIdentity identity = new GenericIdentity(EBSecurityData.ProviderId.ToString(), "Forms");
GenericPrincipal principal = new GenericPrincipal(identity, new string[] { });
HttpContext.Current.User = principal;
isAuth = true;
string actionName = actionContext.ActionDescriptor.ActionName.ToLower();
string actionNo;
EBACLS.TryGetValue(actionName, out actionNo);
if (!string.IsNullOrWhiteSpace(EBSecurityData.Acl) && !string.IsNullOrWhiteSpace(actionNo))
{
string acl = string.Format(",{0},", EBSecurityData.Acl);
isPermission = acl.Contains("," + actionNo + ",");
}
}
}
if (!isAuth)
{
throw new BusinessException(" ", 401);
}
else if (!isPermission)
{
throw new BusinessException(" ", 403);
}
}
}
public static Dictionary<string, string> EBACLS { get; set; }
Dictionary<string, string> SetEBACLSData()
{
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("getorderitemoperaterecords", "01");
dic.Add("getorderitemchangedetail", "02");
return dic;
}
}
httpヘッダ要求例:User-Agent:FiddlerHost:localhostContntntint Length:478 Contentt Type:tex/ jsonMySecurityKey:roxnQNJLa0 voulFXMcGGGGGGGGGGGGGGGGGGGGGGGGGGJJJJJTTTJJJJJJJJJT1 nJJJJJJJJJJJJJTTT1 nJJJJJJJJJJJJJJJJJJJJJJJJJTTT1 HmBBBBBBBBtDV1 HmmBBBBBBBBBBumumFFFFFFFF3 AuYcEN%2 F 9873 lIjxyuK%2 FUQ 75 vJ 3 kH 3 bYIZykRmSvR 4 fPMbxNVHuhO%2 BdVJQDpLS 2 KbjffkMNYBJJJJJWPJ%2 FLzCIesaLh%2 CFDJJPJJJJJJJJJJJJJJJpJ 9 WJ7 ahN%2 Fj%2 BkmWNJYBxPPVO 3 IU%3 D
手に入れました MySecurityKeyの値は、どのように処理すればいいですか?私のところは同じ例です。効果的にapiの安全係数を増加します。どの方法が重要かというと、権限を使うには、上に[
MyAuthFilterラベルは、権限検証を実現することができます。もちろん、異なる方法であれば、異なるトランシーバーを使用することもできます。自分で勝手に定義できます。