Это известная проблема с SDK, сохраняющим данные в сеансе. Я не уверен на 100% в C #, но думаю, что он такой же, как PHP. SDK (в PHP) проверяет, доступен ли подписанный запрос пользователя в сеансе:
public function getSignedRequest() {
if (!$this->signedRequest) {
if (isset($_REQUEST['signed_request'])) {
$this->signedRequest = $this->parseSignedRequest(
...
Я каждый раз проверяю действительность токена доступа текущего пользователя. Но кто-то упомянул, что это не эффективно (хотя я склонен не соглашаться :)).
Короче говоря, SDK не проверяет правильность и принимает данные из сеанса в качестве первого источника. Вот почему второй пользователь имеет данные первого пользователя.