對於近來做的一個系統,要求訪問API的請求頭,必須傳System(系統)和Device(設備),且訪問值存在於定義的枚舉SystemEnum和DeviceEnum中,纔可訪問API。以下是實現代碼:
using _SCscHero.Base.Enum;
using _SCscHero.Model;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Linq;
using static _SCscHero.Base.UnifyAPI;
namespace _SCscHeroAPI.Base.CustomAttribute
{
/// <summary>
/// 頒發令牌專用-資源頭校驗器
/// </summary>
public class HeaderResourceFilter : Attribute, IResourceFilter
{
/// <summary>
/// 資源加載後
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuted(ResourceExecutedContext context)
{
}
/// <summary>
/// 資源加載前
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuting(ResourceExecutingContext context)
{
int systemInt = Convert.ToInt32(context.HttpContext.Request.Headers["System"].FirstOrDefault());
int deviceInt = Convert.ToInt32(context.HttpContext.Request.Headers["Device"].FirstOrDefault());
if (!Enum.IsDefined(typeof(UnifyLoginEnum.SystemEnum), systemInt))
{
context.Result = new ObjectResult(new ResultModel(MsgConstant.HEADER_SYSTEM_ERROR, CodeConstant.HEADER_SYSTEM_ERROR));
context.HttpContext.Response.Headers.Add("HEADER_SYSTEM_ERROR", new string[] { "HEADER_SYSTEM_ERROR" });
}
if (!Enum.IsDefined(typeof(UnifyLoginEnum.DeviceEnum), deviceInt))
{
context.Result = new ObjectResult(new ResultModel(MsgConstant.HEADER_DEVICE_ERROR, CodeConstant.HEADER_DEVICE_ERROR));
context.HttpContext.Response.Headers.Add("HEADER_DEVICE_ERROR", new string[] { "HEADER_DEVICE_ERROR" });
}
}
}
}