Azure 上的 ASP.NET HttpContext 为 null

Zum*_*pel 5 asp.net httpcontext blazor-server-side

我有一个托管在 Azure 上的 ASP.NET Blazor Web 应用程序。一切正常,除了一件小事。我按照文档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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我后来将此代码称为类似:

var user = await sessionService.GetUser();
if (user == null)
{
   await sessionService.AuthenticateUser();
   user = await sessionService.GetUser();
}
Run Code Online (Sandbox Code Playgroud)

这适用于迄今为止我测试过的每台本地计算机。我在发布或调试中构建它并不重要。所有数据均已正确加载,我可以检索当前登录用户的 ID。

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

Nb7*_*777 5

您需要注入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;
} 
Run Code Online (Sandbox Code Playgroud)