C# 如何在登录.net core 3.1 web应用程序时在startup.cs中设置全局数据?

C# 如何在登录.net core 3.1 web应用程序时在startup.cs中设置全局数据?,c#,asp.net-core,global-variables,asp.net-core-3.1,web-application-project,C#,Asp.net Core,Global Variables,Asp.net Core 3.1,Web Application Project,我的.net core 3.1 web应用程序从用户必须登录开始,同时选择公司/分支机构(CompanyCode)。 现在,我如何以及在何处保存此应用程序数据“CompanyCode”,以便在会话的其余部分中使用。 我已经找到了在startup.cs文件中设置其他静态全局变量(常量)的方法 public void ConfigureServices(IServiceCollection services) { Action<GlobalData&g

我的.net core 3.1 web应用程序从用户必须登录开始,同时选择公司/分支机构(CompanyCode)。 现在,我如何以及在何处保存此应用程序数据“CompanyCode”,以便在会话的其余部分中使用。 我已经找到了在startup.cs文件中设置其他静态全局变量(常量)的方法

 public void ConfigureServices(IServiceCollection services)
        {
            Action<GlobalData> gData = (g =>
            {
                g.CompanyCode = 2;
                g.DummyCust = 3;
                g.Type_Personal = 0;
                g.Type_Asset = 1;
                g.Type_Bank = 2;

                g.Type_Customer = 1;
                g.Type_Staff = 2;

            });
            services.Configure(gData);
            services.AddSingleton(resolver => resolver.GetRequiredService<IOptions<GlobalData>>().Value);

            services.AddControllersWithViews();

            services.AddDbContext<ImgContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ImgContext")));
        }
现在CompanyCode是登录后设置的动态全局数据;我怎样才能做到呢? 请帮忙。
多亏了

一种快速的方法是在静态类中集中所有常量(假设这些值在开发过程中是固定的,而不是配置设置),最好也是最简单的方法是

  • 成功登录后,将companyCode返回给调用者

  • 调用者(可能是javascript应用程序,将全局存储公司代码,例如localstorage。)

  • 让调用方在请求头中包含companyCode

  • 这样,您就可以读取标题并获取公司代码

  • 让这更容易的一些方法-

    • 使用JWT进行身份验证,这样您就可以简单地将companyCode包含在您的令牌中,并且没有人可以篡改它

    • 登录时将公司代码存储在httpOnly cookie中。然后,Cookies会自动包含在您的webapp的每个请求中。当然,要使此解决方案起作用,您需要要求您的用户启用cookies(这是可以的,许多网站都启用了cookies)

    现在,我如何以及在何处保存此应用程序数据“CompanyCode”,以便在会话的其余部分中使用

    例如,您还可以在登录控制器/razor页面中使用DI来获取和设置
    CompanyCode

    public class AccountController : Controller
    {
        private readonly IOptions<GlobalData> _globalData;
    
        public AccountController(IOptions<GlobalData> globalData)
        {
            _globalData = globalData;
        }
    
        [HttpPost]
        public IActionResult Login()
        {
           var originalData = _globalData.Value.CompanyCode;
           //after login successfully
           //replace below 100 with your selected `CompanyCode`,
           _globalData.Value.CompanyCode = 100
    
            return View();
        }
    }
    
    公共类AccountController:控制器
    {
    私有只读IOPS_globalData;
    公共帐户控制器(IOptions globalData)
    {
    _globalData=globalData;
    }
    [HttpPost]
    公共IActionResult登录()
    {
    var originalData=_globalData.Value.CompanyCode;
    //成功登录后
    //用您选择的“公司代码”替换低于100的代码,
    _globalData.Value.CompanyCode=100
    返回视图();
    }
    }
    

    请参阅

    因为这是一个网站,我假设会有多个同时的用户,因此任何类型的全局“用户”设置都是错误的。登录时,服务器将发回标识该用户的令牌,然后浏览器将该令牌发回服务器,以允许其标识用户设置。我建议你看一些关于@Neil的例子,你不需要使用令牌登录。看看如何使用JWT。如果两个来自不同公司的用户登录,这将如何工作?
    public class AccountController : Controller
    {
        private readonly IOptions<GlobalData> _globalData;
    
        public AccountController(IOptions<GlobalData> globalData)
        {
            _globalData = globalData;
        }
    
        [HttpPost]
        public IActionResult Login()
        {
           var originalData = _globalData.Value.CompanyCode;
           //after login successfully
           //replace below 100 with your selected `CompanyCode`,
           _globalData.Value.CompanyCode = 100
    
            return View();
        }
    }