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;
}
我有一个 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;
}