举例:请求时,会在请求header中携带用户身份信息,在请求后续处理中,会经常用到用户身份信息,在多层中怎么样避免一层一层传递
我是用JWT /// <summary>
/// 重写过滤器
/// </summary>
/// <param name="context"></param>
public void OnActionExecuting(ActionExecutingContext context)
{
ReturnModel ret = new ReturnModel();
if (context.HttpContext.Request.Headers.ContainsKey("access_token"))
{
//获取token
// object tokenobj = context.ActionArguments["token"];//请求参数获取,用地址栏的参数 还需要加验证
object tokenobj = context.HttpContext.Request.Headers["access_token"].ToString();//请求头里面获取
string token = tokenobj.ToString();
string loginID = "";
//验证jwt,同时取出来jwt里边的用户ID
TokenType tokenType = tokenHelper.ValiTokenState(token, a => a["iss"] == "QmWyy" && a["aud"] == "HospEveryCus", action => { loginID = action["Id"]; });
if (tokenType == TokenType.Fail)
{
ret.Code = 202;
ret.Msg = "access_token验证失败";
context.Result = new JsonResult(ret);
return;
}
if (tokenType == TokenType.Expired)
{
ret.Code = 205;
ret.Msg = "access_token已经过期";
context.Result = new JsonResult(ret);
}
if (!string.IsNullOrEmpty(loginID))
{
//给控制器传递参数(需要什么参数其实可以做成可以配置的,在过滤器里边加字段即可)
context.ActionArguments.Add("patientId", loginID);//存储当前客户的ID
}
}
else
{
ret.Code = 401;
ret.Msg = "没有令牌,禁止访问";
context.Result = new JsonResult(ret);
return;
}
}
你可以封装到一个公共类里面,当请求过来,就包装一下,然后每个接口都能获取到用户的信息,
你把用户信息放到header里面不太安全,最好是在header里面存一个用户标识,然后在后台查询用户信息,在包装成用户类
可以从Header接收,存储再静态变量中
var originValue = headers["user"].ToString();
if (string.IsNullOrWhiteSpace(originValue)) return null;
var decodeValue = HttpUtility.UrlDecode(originValue);
var user = SerializerHelper.JsonDeserialize<BaseUser>(decodeValue);
更多知识点《.NET Core 跨平台实战》