IHttpContextAccessor.HttpContext.User.Identity 显示 CurrentUserService 服务中的所有 null 属性

2023-11-30

我正在尝试使用Jason Taylor 的简洁架构模板,这个模板使用 NSwag 自动创建 TypeScript 客户端(Angular),但我不需要创建 TS 客户端,所以我的主要目标是用 Razor Pages 替换它。我已经能够取得高分,但我在这方面遇到了麻烦当前用户服务每当实例化它时,都应该在此行中设置 UserId:

UserId = httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);

这是完整的当前用户服务:

using CleanREC0.Application.Common.Interfaces;
using Microsoft.AspNetCore.Http;
using System.Security.Claims;

namespace CleanREC0.WebUI.Services
{
    public class CurrentUserService : ICurrentUserService
    {
        public CurrentUserService(IHttpContextAccessor httpContextAccessor)
        {
            UserId = httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
        }

        public string UserId { get; }
    }
}

第一次甚至 HttpContext 是null这很好,因为一切都在初始化,但后续调用总是返回null在所有的httpContextAccessor.HttpContext.User.Identity属性,用户显示Identity好吧,但它的所有属性和声明都是null or 没有结果,即使用户正确登录。

以下是我对模板所做的操作的列表:

  • 摆脱NSwag和所有打字稿 Related
  • 摆脱身份服务器
  • 已更换ApiAuthorizationDbContext for 身份数据库上下文

这是我的启动课程:

public class Startup
    {
        public Startup(IConfiguration configuration, IWebHostEnvironment environment)
        {
            Configuration = configuration;
            Environment = environment;
        }

        public IConfiguration Configuration { get; }
        public IWebHostEnvironment Environment { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddApplication();
            services.AddInfrastructure(Configuration, Environment);    

            services.AddScoped<ICurrentUserService, CurrentUserService>();

            services.AddHttpContextAccessor();
            services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); //I have added this line on as suggested on other post, but made no difference.


            services.AddHealthChecks()
                .AddDbContextCheck<ApplicationDbContext>();

            services.AddRazorPages()
                .AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<IApplicationDbContext>());
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }

            app.UseCustomExceptionHandler();
            app.UseHealthChecks("/health");
            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
            });
        }
    }

这是添加应用程序被调用的配置服务:

public static IServiceCollection AddApplication(this IServiceCollection services)
        {
            services.AddAutoMapper(Assembly.GetExecutingAssembly());
            services.AddMediatR(Assembly.GetExecutingAssembly());
            services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RequestPerformanceBehaviour<,>));
            services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RequestValidationBehavior<,>));

            return services;
        }

And the 添加基础设施那里也被调用:

public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration, IWebHostEnvironment environment)
        {
            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    configuration.GetConnectionString("DefaultConnection"), 
                    b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName)));

            services.AddScoped<IApplicationDbContext>(provider => provider.GetService<ApplicationDbContext>());

            services.AddDefaultIdentity<ApplicationUser>()
                .AddEntityFrameworkStores<ApplicationDbContext>();

            if (environment.IsEnvironment("Test"))
            {

            }
            else
            {
                services.AddTransient<IDateTime, DateTimeService>();
                services.AddTransient<IIdentityService, IdentityService>();
                services.AddTransient<ICsvFileBuilder, CsvFileBuilder>();
            }

            services.AddAuthentication();

            return services;
        }

其他一切似乎都运行良好。在剃刀页面水平User变量,它是Identity包含所有预期的信息和声明。

我确信我错过了一些东西,有人可以指出我正确的方向吗?


评论中 LinkedList 的链接让我找到了正确的方向。

该链接指向一个解释这一点的答案:

在 ASP.NET MVC 框架下,HttpContext(因此 当控制器类为 HttpContext.Session) 时未设置 正如您所期望的那样构建,但它稍后由 ControllerBuilder 类。

The 当前用户服务我正在使用的模板附带的类尝试读取构造函数中的用户声明,因此我将代码移至属性的 getter,该 getter 会执行到后者实际使用属性时,届时所有声明和属性都已填充完毕。

My new 当前用户服务看起来像这样:

using CleanREC0.Application.Common.Interfaces;
using Microsoft.AspNetCore.Http;
using System.Security.Claims;

namespace CleanREC0.WebUI.Services
{
    public class CurrentUserService : ICurrentUserService
    {
        private IHttpContextAccessor _httpContextAccessor;

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

        public string UserId { get { return _httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier); }}
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IHttpContextAccessor.HttpContext.User.Identity 显示 CurrentUserService 服务中的所有 null 属性 的相关文章

随机推荐

  • 如何等待网页完全加载后再继续脚本?

    在继续执行脚本之前如何等待网页完全加载 我知道如果您希望它等待 4 秒 您可以使用延迟 4 但这不够安全 在 VBA 中 您有一个始终有效的简单代码 如下所示 Dim x As String x https na6 salesforce c
  • 使用Python3检测日期格式并将其转换为MM-DD-YYYY

    我正在尝试使用 Python 3 6 转换日期格式并使它们在整个文档中统一 这是我的文档中的日期示例 由于文档很大 可以有其他格式 9 21 1989 19640430 6 27 1980 5 11 1987 Mar 12 1951 2 a
  • 任务/预留超时后将 twilio 任务重定向到新的 TwiML

    目前使用 Twilio TaskRouter 构建电话呼叫中心来路由呼叫 我的目标是 当任务在一定时间内处于待处理状态 即没有工作人员可供预订 时 将其重定向到语音信箱 当任务被保留但工作人员没有响应时 将其重定向到语音邮件 我当前的实施是
  • R:按字母数字列对数据框中的所有列进行排序

    我想按包含字母数字数据的列对 R 中数据帧的所有列进行排序 这是一个示例数据框 R gt dd lt data frame b c Hi Med Hi Low x c A D A C y c 8 3 9 9 z c A1 A3 A10 A2
  • 将 Jenkins 管道阶段显示为失败,但不会导致整个作业失败

    这是我正在使用的代码 node stage build echo build stage tests echo tests stage end to end tests def e2e build job end to end tests
  • 使用 FCM 在 Apple Safari 中推送通知

    我们在 Chrome 和 Firefox 中使用 FCM 实现了推送通知 并且运行良好 但 Safari 不支持 FCM 强制要求的 Service Workers 有人处理过此类问题吗 有什么建议么 虽然 Service Workers
  • 在Android中捕获自定义列表视图的点击

    我使用了一个自定义 XML 文件来创建将我的数据库游标绑定在 ListActivity 中 XML 文件中的每个项目都有 2 个按钮 我想捕获按钮的点击事件和列表中的位置 这是我的 XML 文件
  • 如何增加 MATLAB 2014b 散点图中图例的标记大小? [复制]

    这个问题在这里已经有答案了 我发现散点图中的标记大小和 MATLAB 2014b 中的图例不同 我搜索并找到了早期版本的 MATLAB 中的一些解决方案 这些解决方案不适用于最新版本 在我当前的版本中 图例中的标记尺寸非常小 几乎无法区分
  • 媒体播放器和播放延迟

    我创建了一个小应用程序 即媒体播放器 我有方法 我有一首歌 我想在单击按钮后延迟播放声音 我怎样才能做到这一点延迟 我想点击按钮 5 秒后音乐就会播放 我在用 MediaPlayer create获取歌曲和mediaplayer start
  • C++ 将派生类 shared_ptr 传递给模板化函数

    首先是应该起作用的东西 然后是不起作用的东西 为什么不是这个问题 我声明两个类 class Base class Derived public Base 然后我在其他地方有以下功能 void foo shared ptr base 下面的代
  • wxpython——线程和窗口事件

    我有一个 wxPython 应用程序 http www OpenSTV org 使用多轮方法计算选票 我想做两件事 1 对于大量选票 这可能有点慢 所以我想向用户显示一个进度对话框 这样他就不会认为应用程序被冻结 2 我想允许用户手动打破平
  • 在 google go 中使用 olivere/elastic 更新 ElasticSearch 中的记录

    我正在使用 go 在弹性搜索中插入一条记录 如下所示 https github com olivere elastic现在 如果我必须部分更新它 假设只有一个条目 如 名称 那么我想使用 UPDATE API 我找不到任何描述如何在 oil
  • JSF RichTable 合并标题中的行/列

    我想做的是做这个布局RichTable在其标题中有 3 列 3 5 1 2 4 6 我已经习惯了this 8 2 完成任务的资源 富脸4 0 0 但相反 我最终得到了没有任何合并的普通表行 您能解释一下吗 Update 关于来自的答案瓦西尔
  • 多个组件 - 性能损失?

    我有一个清单System IO Ports SerialPort一个程序集中的对象 并且我计划处理来自另一个程序集的 Data Receieved 事件 我想知道这是否会以某种方式影响性能 会吗 恐怕我不太清楚 CLR 如何管理程序集 谢谢
  • 从 VS 05 中的资源设置应用程序图标

    我知道我可以将图标添加到项目的 Resources resx 文件中 然后从代码中引用该图标 如何从资源中设置整个EXE的图标 我所看到的只是浏览另一个文件的地方 我想使用我的资源中的当前图标文件 而不必在我的项目中拥有重复的文件 than
  • 如何将两个独立但相似的代码库合并到一个 SVN 代表中?

    I have www example com 上的 var www cool codebase 并且我有 www example net 上的 var www cool codebase 代码库适用于在不同服务器上运行的同一 Web 应用程
  • 将 nil 排序到可选字符串数组的末尾

    如果我有一个可选字符串数组 并且我想以 nils 开头按升序对它进行排序 我可以在一行中轻松完成 b nil a sorted 0 lt 1 nil a b 但似乎没有任何类似简单的解决方案可以将 nil 排序到end数组的 使用大多数其他
  • 是否有 Visual Studio 插件的配置类型文件?

    创建 Visual Studio 加载项时 如何利用该加载项的 app config 如果我向项目添加一个并部署它 那么当加载项运行并且我以编程方式尝试通过 ConfigurationManager AppSettings 访问它时 它不会
  • xargs 在搜索中尊重通配符

    我有一个名为 file1 txt 的文件 dir1 dir2 dir3 我想使用 xargs 检查某些文件是否存在于文件系统中 如下所示 cat file1 txt xargs i ls projects analysis7 meta bw
  • IHttpContextAccessor.HttpContext.User.Identity 显示 CurrentUserService 服务中的所有 null 属性

    我正在尝试使用Jason Taylor 的简洁架构模板 这个模板使用 NSwag 自动创建 TypeScript 客户端 Angular 但我不需要创建 TS 客户端 所以我的主要目标是用 Razor Pages 替换它 我已经能够取得高分