首页 新闻 会员 周边 捐助

有人遇到过Asp.Net Core在自定义的类中注入IHttpContextAccessor获取到的HttpContext.User.Clamis为空的情况吗?

0
[已解决问题] 解决于 2018-12-12 21:49

我自定义了一个LoginInfo类,使用单例模式注入

public class JwtLoginInfo : ILoginInfo
    {
        private readonly HttpContext _httpContext;

        public JwtLoginInfo(IHttpContextAccessor httpContextAccessor)
        {
            _httpContext = httpContextAccessor.HttpContext;
        }

        public Guid AccountId
        {
            get
            {
                var accountId = _httpContext.User.FindFirst("id");
                if (accountId != null && accountId.Value.NotNull())
                {
                    return new Guid(accountId.Value);
                }

                return Guid.Empty;
            }
        }

    }

使用上面的代码,会出现_httpContext.User.Clamis为empty的情况,导致accountId有时能获取到,有时候获取不到

IAMOLDLI的主页 IAMOLDLI | 初学一级 | 园豆:154
提问于:2018-12-11 23:18

貌似是httpcontext生命周期的问题,https://github.com/aspnet/AspNetCore/issues/3668 有木有大佬给解释一下

oldli 6年前
< >
分享
最佳答案
0

不能使用单例模式注入,改用 Scoped

奖励园豆:5
dudu | 高人七级 |园豆:29568 | 2018-12-12 08:27

或者改为

public class JwtLoginInfo : ILoginInfo
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public JwtLoginInfo(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public Guid AccountId
    {
        get
        {
            var accountId = _httpContextAccessor.HttpContext.User.FindFirst("id");
            if (accountId != null && accountId.Value.NotNull())
            {
                return new Guid(accountId.Value);
            }

            return Guid.Empty;
        }
    }
}
dudu | 园豆:29568 (高人七级) | 2018-12-12 08:30

@dudu: 老大,这个是什么原因呢?是不是因为在get里面访问HttpContext的时候与构造函数里面的状态不一样了

IAMOLDLI | 园豆:154 (初学一级) | 2018-12-12 09:10

@oldli: 问题不是构造函数中访问 HttpContext,而是你将 HttpContext 赋值给了 _httpContext ,单例模式下的成员变量 _httpContext 相当于是静态的,而 HttpContext 是针对请求的

dudu | 园豆:29568 (高人七级) | 2018-12-12 10:05

@dudu: 明白了,谢谢老大~

IAMOLDLI | 园豆:154 (初学一级) | 2018-12-12 21:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册