对于近来做的一个系统,要求访问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" });
}
}
}
}