ASP.NET HttpContext 在 Azure 上为空

ASP.NET HttpContext is null on Azure

我有一个 ASP.NET Blazor Web 应用程序,它托管在 Azure 上。一切正常,除了一件小事。我按照 Documentation.

中的描述使用 IHttpContextAccessor.HttpContext
    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 吗?

您需要注入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;
}