На моем сайте ASP.NET Core 2.1.0 MVC происходит что-то довольно страшное. Пока я просматривал сайт, вдруг выяснилось, что я вошел в систему как другой пользователь (который также просматривал сайт в это время).
Я не могу точно определить, есть ли конкретный вариант использования, который вызывает это, но это произошло уже дважды. При переходе на другие страницы по-прежнему отображается, что я вошел в систему как другой пользователь. Мне даже кажется, что я принимаю претензии пользователя, под которым я неправильно вошел в систему.
Мой вопрос: из-за чего это могло произойти?
EDIT: с тех пор я изменил userManager
и notificationService
на "ограниченный", и эта проблема возникла снова, поэтому потенциальная проблема, описанная здесь, не может быть причиной.
Пытаясь разобраться в этом, я считаю, что виновником может быть следующий вызов в _Layout.cshtml
:
@inject UserManager<ApplicationUser> userManager
@inject NotificationService notificationService
@inject CommunityService communityService
@{
ApplicationUser user = await userManager.GetUserAsync( User );
}
Возвращенный user
используется для отображения информации о пользователе и вызовов notificationService
и communityService
. Они также показывали данные, относящиеся к неправильному (не мне) пользователю.
Если это имеет значение, вот как ApplicationDbContext
настроен в Startup.cs
:
// Add framework services.
services
.AddDbContext<ApplicationDbContext>( options => options
.UseLazyLoadingProxies()
.UseSqlServer(_configuration.GetConnectionString( "DefaultConnection" ) ) );
services
.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
Я вспомнил, что 'scoped' — рекомендуемое время жизни, которое следует использовать при регистрации Entity Framework для внедрения зависимостей. Однако и NotificationService
, и CommunityService
регистрируются как "переходные" и запрашивают ApplicationDbContext
через внедрение конструктора для доступа к данным.
services.AddTransient<CommunityService, CommunityService>();
services.AddTransient<NotificationService, NotificationService>();
Может ли это иметь какое-то отношение к этому? В настоящее время я не понимаю, может ли это иметь какое-либо значение. Кажется, я не могу воспроизвести эту проблему.
UserManager<ApplicationUser>
— это значение по умолчанию, предоставляемое MVC, и я просто показываюuser.DisplayName
(которое отображается как «не я»). Кроме того, я не могу войти в систему как другой пользователь (например, у меня нет pwd или аутентификации Google, в зависимости от того, что он использует). - person Steven Jeuris   schedule 28.07.2018DisplayName
уже является свойством, которое я добавил сам, но это простое свойство с геттером и сеттером, которые я добавил кApplicationUser : IdentityUser
по умолчанию. - person Steven Jeuris   schedule 28.07.2018ApplicationDbContext
, выполняя сопоставление идентификаторов, например,_data.Notifications.Where( n => n.UserId == user.Id )
. Однако у меня есть один метод, который фактически устанавливает свойство переданного пользовательского объекта и вызывает_data.SaveChangesAsync()
вnotificationService
. Это вызывается с другой страницы, чемLayout
(Уведомления). Имеет ли это значение? - person Steven Jeuris   schedule 28.07.2018ApplicationUser user = await userManager.GetUserAsync( User );
- Какой здесь параметр User? Обычно я использую утверждение «sub», которое является уникальным идентификатором текущего пользователя, и использую FindById для получения сведений о пользователе. Переходный объект более ограничен, т. Е. Каждое место, где требуется объект, новый экземпляр предоставляется инфраструктурой DI, но с «областью действия» один и тот же объект используется совместно, но для этого одного запроса. - person Thangadurai   schedule 29.07.2018User
предоставляется MVC и определяется вRazorPageBase
какpublic virtual ClaimsPrincipal User { get; }
. - person Steven Jeuris   schedule 29.07.2018