У меня есть сценарий, в котором мне нужно получить доступ к утверждениям User.Identity
в моем контроллере конструктора.
Мне это нужно, потому что в утверждениях есть информация, необходимая мне для развертывания настраиваемого контекста БД (строка подключения)
Как я могу получить к нему доступ? Я бы просто вставил DBContext, но в зависимости от пользователя им может потребоваться доступ к другой БД.
Есть ли лучший способ подумать об этом?
[Authorize]
public class DefaultController : Controller
{
public DefaultController()
{
// this is NULL
var authenticatedUser = User.Identity.Name;
}
}
Мне просто нужно получить доступ к User.Identity в конструкторе контроллера.
Вы должны показать нам, что вы пробовали, и мы изменим образец там, чтобы помочь вам узнать, как получить доступ к данным, которые вы ищете.
Доступ к User
в конструкторе контроллера всегда будет нулевым. Больше ничего не поделаешь. Попробуйте использовать ActionFilter
.
This code I using to get the calims
--------
int user_id = 0;
int Account_id = 0;
List<string> roles;
public TEMP_CON_Controller(DatabaseContext context,IHttpContextAccessor,httpContextAccessor)
{
_context = context;
if (httpContextAccessor.HttpContext.User.Identity.IsAuthenticated)
{
var user = httpContextAccessor.HttpContext.User;
this.user_id = int.Parse(user.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value);
IEnumerable<Claim> claims = user.Claims;
var accId = claims.Where(x => x.Type == "AccountId").Select(c => c.Value).SingleOrDefault();
if (!string.IsNullOrEmpty(accId))
this.Account_id = Int32.Parse(accId);
roles = claims.Where(x => x.Type == ClaimTypes.Role).Select(c => c.Value).ToList();
}
}
Я вижу httpContextAccessor.HttpContext.User как NULL
возможно, ваша конфигурация startup.cs не завершена, см. эту ссылку для обнаружения конфигураций: dotnetcoretutorials.com/2017/01/05/…
Вы говорите, что можете получить доступ к пользователю в конструкторе контроллера? Кажется, противоречит тому, что говорят другие
что угодно в контроллере или в любом файле C# ... вы должны сделать код внутри оператора if, чтобы получить информацию о пользователе, этот код, который я использую в своих проектах
Чтобы получить доступ к утверждениям User.Identity в ядре .Net, вам необходимо использовать HttpContext. Вот моя реализация ниже
Первая регистрация
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
А затем зарегистрируйтесь в классе службы или контроллера
private readonly IHttpContextAccessor _httpContextAccessor;
public UserService(
IHttpContextAccessor httpContextAccessor,
IUnitOfWork unitOfWork,
UserManager<User> userManager,
SignInManager<User> signInManager,
RoleManager<ApplicationRole> roleManager)
{
_httpContextAccessor = httpContextAccessor;
_unitOfWork = unitOfWork;
_userManager = userManager;
_signInManager = signInManager;
_roleManager = roleManager;
_currentUserGuid = _httpContextAccessor?.HttpContext?.User?.FindFirst(UserClaimsKey.Sub)?.Value;
_currentUserName = _httpContextAccessor?.HttpContext?.User?.Identity?.Name;
_currentUserEmail = _currentUserGuid == null ? "" : userManager.FindByIdAsync(_currentUserGuid)?.Result?.Email;
}
Подробности реализации можно найти в здесь
Пожалуйста, дайте мне знать, если у вас возникнут проблемы
Начиная с версии 2.1 ASP.NET Core предоставляется HttpContextAccessor
. Для этого мы должны выполнить следующие шаги:
Настройте службу, используя стандартную реализацию в методе ConfigureServices
Startup.cs
:
services.AddHttpContextAccessor();
Выполните внедрение зависимости IHttpContextAccessor
на контроллеры. Используйте свойство HttpContext
для доступа к User
[Authorize]
public class DefaultController : Controller
{
public DefaultController(IHttpContextAccessor contextAccessor)
{
// Here HttpContext is not Null :)
var authenticatedUser = contextAccessor.HttpContext.User.Identity.Name;
}
}
Верно, но Пользователь по-прежнему равен нулю.
Вы должны проверить правильность конфигурации в Startup, у меня это работает.
Я сделал это, но моя конфигурация IIS была неправильной, это исправило. Вы можете открыть IIS и: 1-Активировать аутентификацию Windows; 2-Отключить анонимную аутентификацию. от здесь
Из Рабеа Аль-Тараде по ссылке выше:
Startup.cs
//services section
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
[Authorize]
public class HomeController : Controller
{
#region DI
private string UserEmail;
private readonly IHttpContextAccessor _httpContextAccessor;
public HomeController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
UserEmail = _httpContextAccessor.HttpContext.User.Claims
.FirstOrDefault(c => c.Type == "preferred_username")?.Value;
}
#endregion DI
public IActionResult Index()
{
ViewBag.UserEmail = UserEmail;
return View();
}
}
Я использую asp net core 2.2
В Asp.net Core v.2 + вам не нужно вводить HttpContext или что-то в этом роде. Доступ к пользователю просто так:
public IActionResult GetMe()
{
return Ok(User.Identity.Name);
}
Это будет работать в методе контроллера, поскольку пользователь был определен. Вопрос касался доступа к члену User в конструкторе, который недоступен, если вы не используете HttpContextAccessor, как показано в сообщении batressc.
Покажите нам пример кода класса, который в этом нуждается.