ASP.NET HttpContext 在 Azure 上为空

Posted

技术标签:

【中文标题】ASP.NET HttpContext 在 Azure 上为空【英文标题】:ASP.NET HttpContext is null on Azure 【发布时间】:2022-01-20 11:10:31 【问题描述】:

我有一个托管在 Azure 上的 ASP.NET Blazor Web 应用程序。一切正常,除了一件小事。我使用IHttpContextAccessor.HttpContext,如Documentation 中所述。

    public class SessionService : ISessionService
    
        private readonly IHttpContextAccessor httpContextAccessor;
        private readonly IUserService userService;

        public SessionService(
            IUserService userService,
            IHttpContextAccessor httpContextAccessor)
        
            this.userService = userService;
            this.httpContextAccessor = httpContextAccessor;
        

        public async Task<User> GetUser()
        
            var userId = this.httpContextAccessor.HttpContext?.Items["userId"]?.ToString();
            
            if (userId == null)
            
                return null;
            

            if (!int.TryParse(userId, out var parsedUserId))
            
                return null;
            

            return await this.userService.Get(parsedUserId);
        

        /// <inheritdoc />
        public async Task AuthenticateUser()
        
            if (this.httpContextAccessor.HttpContext == null)
            
                return;
            

            // Authentication Logic
            // ...

            this.httpContextAccessor.HttpContext.Items["userId"] = authenticatedUser.id;
        
    

我稍后将这段代码称为:

var user = await sessionService.GetUser();
if (user == null)

   await sessionService.AuthenticateUser();
   user = await sessionService.GetUser();

到目前为止,这适用于我测试过的每台本地机器。我是在 Release 还是 Debug 中构建它并不重要。所有数据都已正确加载,我可以检索当前登录用户的 ID。

无论如何,如果我将应用程序发布到 azure,HttpContext 始终为空。我现在已经多次检查文档,但找不到任何将我推向正确方向的东西。我需要配置一些东西来专门使用 HttpContext 吗?

【问题讨论】:

【参考方案1】:

您需要注入AuthenticationStateProvider 以从图表中获取信息,请不要使用IHttpContextAccessor 因为它存在安全问题,您可以在microsoft doc 中阅读更多相关信息。 如何使用AuthenticationStateProvider: 在 blazor 页面中注入 AuthenticationStateProvider 如下:

[Inject]
public AuthenticationStateProvider AuthenticationState  get; set; 
 
protected override async Task OnInitializedAsync()

  var AuthSate = await AuthenticationState.GetAuthenticationStateAsync();
  var user = AuthSate.User;
 

【讨论】:

谢谢!我想我为自己过于复杂了。我已经在使用 AuthenticationState 来获取当前登录用户的身份名称。出于某种奇怪的原因,我认为将这些数据准确地存储在 cookie 中可能是个好主意。无论如何,正如我刚刚意识到的那样,当我阅读您的答案时,这没有任何意义,因为我实际上可以直接访问 AuthenticationState。

以上是关于ASP.NET HttpContext 在 Azure 上为空的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET HttpContext 在 Azure 上为空

如何在 ASP.NET Core 中获取 HttpContext.Current? [复制]

在当前 HTTPContext 中生成新的 ASP.NET 会话

ASP.NET Core 2.1 在视图中使用 HttpContext

HttpContext 在以 ASP.NET 兼容模式运行的 WCF 服务中为空

Asp.net中的Cache--HttpRuntim.Cache 和 HttpContext.Current.Cache