HttpContext
имеет ограниченный срок службы и теперь вводится зависимость. В местах, где у вас нет доступа к нему из коробки (контроллеры / страницы / представления), вы можете внедрить IHttpContextAccessor
, который является единственным, который знает, как извлечь экземпляр HttpContext
в области видимости.
public class MyClass
{
private readonly IHttpContextAccessor _httpContextAccessor;
public MyClass(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void MyMethod()
{
var userId = _httpContextAccessor.HttpContext?.User.FindFirstValue(ClaimTypes.NameIdentifier);
if (userId != null)
{
// do something
}
}
}
HttpContext
потенциально может быть нулевым, поэтому вам нужно обработать это с нулевой проверкой.
Вам, конечно, нужно будет зарегистрировать MyClass
в коллекции сервисов, и вам нужно будет также внедрить ее, когда вам это нужно, или ничего из этого не будет работать. Кроме того, IHttpContextAccessor
не включен по умолчанию, так как это оказывает существенное влияние на производительность. Вам нужно будет добавить следующую строку в ConfigureServices
вашего приложения, если вы хотите его использовать:
services.AddHttpContextAccessor();
Теперь, все сказанное, в значительной степени забудь все, что я только что сказал тебе. На самом деле не делай этого. Хорошо спроектированный класс должен следовать принципам SOLID, одним из которых является то, что он должен делать только одну вещь и делать это хорошо. В большинстве случаев совершенно неуместно, чтобы класс в какой-то библиотеке знал что-то вроде HttpContext
.
Вместо этого, если вам нужен идентификатор пользователя в каком-либо методе, просто передайте его этому методу :
public void DoSomethingWithUserId(string userId)
Затем, например, в вашем контроллере, где у вас уже есть доступ к HttpContext
:
myClass.DoSomethingWithUserId(User.FindFirstValue(ClaimTypes.NameIdenfiier));