请问在.net core webapi中多层保存传递当前用户信息,有什么好的处理方式?

2021-02-07 15:23发布

举例:请求时,会在请求header中携带用户身份信息,在请求后续处理中,会经常用到用户身份信息,在多层中怎么样避免一层一层传递

标签:
3条回答
我命由我不由天
2楼-- · 2021-02-07 16:10

你可以封装到一个公共类里面,当请求过来,就包装一下,然后每个接口都能获取到用户的信息,
你把用户信息放到header里面不太安全,最好是在header里面存一个用户标识,然后在后台查询用户信息,在包装成用户类

查看更多
劳资没心,怎么记你
3楼-- · 2021-02-07 16:16

可以从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 跨平台实战》

查看更多
smile是对你的礼貌
4楼-- · 2021-02-07 16:24

我是用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;
        }
    }
查看更多
登录 后发表回答